代码实现 解析 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: ''
}
尝试的方案:
- let buf = new Buffer.from(lnk.expanded.target);
let data = iconv.decode(buf, "cp936"); - let data2= iconv.decode(lnk.target,"GBK")
这两种方式解码出来也都是乱码.
就你这个问题而言,很简单,因为你用的 windows-shortcuts 这个包,他实际上是调用了一个 Shortcut.exe 然后获取这个 exe 的标准输出作为结果处理后给到了你的回调函数中。
而这里的问题就在于,他在内部调用 Shortcut.exe 的时候,使用 utf8 读取了标准输出,变成了。
EF BF BD EF BF BD EF BF BD EF BF BD
而这个就是一个替换字符(
�
),而已这时候再传给你的时候,他就已经丢失了原有的信息了,自然,你再怎么转码,都无法得到你原本的字符,进而以为是乱码了。我们不妨改写一下脚本验证一下
然后使用 imhex 打开 a.txt,就能看到,他已经是一个无效字符的占位符了。
所以,有没有解法?
我试了一下,你列出的另一个包 win-lnk-parser ,他在正确设置了编码的时候是可以取到的
我这边打印是可以的,看了一下原理,是利用了 cscript ,这个兼容性应该会更好一些。
然后我还看到了一个包 windows-shortcut-ps,这个是利用的 powershell,兼容性相比前一个要差一些(不过我这里安装不上这个包)
或者,你也可以去 Shortcut.exe 官网下载一下最新的,然后自己手动调用命令
再把 stdout 读入为 gbk 再转为 utf8,你可以直接参考 windows-shortcut 的代码,也没多少的。