求助: NodeJS 使用第三方库 返回值 乱码的问题 如何解决?-灵析社区

走你啊啊啊啊啊

代码实现 解析 window的 lnk文件 得到实际指向的文件.解析的结果中 出现了乱码. 请问如何解决这个乱码? let ws = require("windows-shortcuts"); var iconv = require("iconv-lite"); const chinese_encoding = "cp936"; const path3 = "C:/Users/40294/AppData/Roaming/Microsoft/Windows/Recent/说明.txt.lnk"; ws.query(path3, function (err, lnk) { console.log(err); console.log(lnk);//乱码 }); 依赖 "dependencies": { "iconv-lite": "^0.6.3", "win-lnk-parser": "^1.1.2", "windows-shortcuts": "^0.1.6" } 输出: PS D:\program\recentfiles> node b.js null { expanded: { target: 'D:\\DevTools\\nacos-server-2.2.2\\nacos\\bin\\˵��.txt', args: '', workingDir: 'D:\\DevTools\\nacos-server-2.2.2\\nacos\\bin', icon: '' }, target: 'D:\\DevTools\\nacos-server-2.2.2\\nacos\\bin\\˵��.txt', args: '', workingDir: 'D:\\DevTools\\nacos-server-2.2.2\\nacos\\bin', runStyle: 1, icon: '', iconIndex: '0', hotkey: 0, desc: '' } 尝试的方案: 1. let buf = new Buffer.from(lnk.expanded.target); let data = iconv.decode(buf, "cp936"); 2. let data2= iconv.decode(lnk.target,"GBK") 这两种方式解码出来也都是乱码.

阅读量:135

点赞量:0

问AI
就你这个问题而言,很简单,因为你用的 windows-shortcuts 这个包,他实际上是调用了一个 Shortcut.exe 然后获取这个 exe 的标准输出作为结果处理后给到了你的回调函数中。 而这里的问题就在于,他在内部调用 Shortcut.exe 的时候,使用 utf8 读取了标准输出,变成了。 "EF BF BD EF BF BD EF BF BD EF BF BD" 而这个就是一个替换字符("�"),而已这时候再传给你的时候,他就已经丢失了原有的信息了,自然,你再怎么转码,都无法得到你原本的字符,进而以为是乱码了。 我们不妨改写一下脚本验证一下 ws.query(path3, function (err, { target }) { fs.writeFile('./a.txt', target, console.error); }); 然后使用 imhex 打开 a.txt,就能看到,他已经是一个无效字符的占位符了。 "image.png" (https://wmprod.oss-cn-shanghai.aliyuncs.com/c/user/20240920/68bc0fef6eb3a5410e9f4cb9151f60f6.png) *** 所以,有没有解法? 我试了一下,你列出的另一个包 win-lnk-parser ,他在正确设置了编码的时候是可以取到的 const lnkParser = require('win-lnk-parser') lnkParser(path3, 936).then(console.log) 我这边打印是可以的,看了一下原理,是利用了 cscript ,这个兼容性应该会更好一些。 然后我还看到了一个包 windows-shortcut-ps,这个是利用的 powershell,兼容性相比前一个要差一些(不过我这里安装不上这个包) 或者,你也可以去 "Shortcut.exe 官网" (https://link.segmentfault.com/?enc=38sRoxetU0wDsw6cWKiBCA%3D%3D.ARnEVBBasOUuV5DDHUug166Ve7qAJ3HZ3a4%2B1eeHs6NLQvmjYeNOucE8x%2BkN6T5a)下载一下最新的,然后自己手动调用命令 Shortcut.exe /F:"测试.txt.lnk" /A:Q 再把 stdout 读入为 gbk 再转为 utf8,你可以直接参考 "windows-shortcut 的代码" (https://link.segmentfault.com/?enc=L%2BVJoWMdlJu8eb6lNW4s6w%3D%3D.UQrKvQbD2CBkoxCaDFRueU4egXkFhBVq1TrZ0xEipVfZ0Tigzc5bHgg39zEfckO%2BQDbwYZfxRvtDbaPf4KN8STz93T4KE2Njnq0VPTmEmxA%3D),也没多少的。