当前位置: 首页 > 知识库问答 >
问题:

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

施博文
2024-07-19

代码实现 解析 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")
    这两种方式解码出来也都是乱码.

共有1个答案

朱宏爽
2024-07-19

您遇到的问题是 .lnk 文件中包含的文件路径使用的是非标准编码(可能是 UTF-16LE),而 windows-shortcuts 库在解析 .lnk 文件时没有正确处理这种编码。对于 Windows 快捷方式中的字符串,特别是当它们包含非 ASCII 字符时(如中文字符),通常使用的是 UTF-16LE 编码。

由于 iconv-lite 和直接操作 Buffer 的方法都没有成功,我们可以考虑直接在 windows-shortcuts 或其依赖库中查找是否有相关的配置或补丁来处理这个问题。但是,由于 windows-shortcuts 似乎是一个比较老的库(根据版本号),它可能不包含对 UTF-16LE 编码的内置支持。

作为替代方案,您可以尝试使用其他更现代或更活跃维护的库,如 win-lnk-parser(尽管您已经列出了它作为依赖,但您实际使用的代码示例中使用的是 windows-shortcuts)。不过,如果 win-lnk-parser 也不直接支持 UTF-16LE,您可能需要自己实现解析 UTF-16LE 编码字符串的逻辑。

以下是一个使用 BufferTextDecoder(Node.js 11+ 中内置)来尝试解析 UTF-16LE 编码字符串的示例(请注意,这只是一个概念性的示例,并且可能需要根据实际的 .lnk 文件格式进行调整):

let ws = require("windows-shortcuts"); // 或者尝试使用 win-lnk-parser

const path3 = "C:/Users/40294/AppData/Roaming/Microsoft/Windows/Recent/说明.txt.lnk";
ws.query(path3, function (err, lnk) {
  if (err) {
    console.error(err);
    return;
  }

  // 假设 lnk.expanded.target 或 lnk.target 包含的是 UTF-16LE 编码的 Buffer
  // 这里需要确认实际的 Buffer 来源和格式
  let targetBuffer = Buffer.from(lnk.expanded.target, 'hex'); // 如果不是 hex 格式,则可能需要其他方式获取 Buffer
  let decoder = new TextDecoder('utf-16le');
  let targetPath = decoder.decode(targetBuffer);

  console.log(targetPath); // 应该输出正确的文件路径
});

注意:这个示例假设 lnk.expanded.targetlnk.target 是一个以某种方式(可能是十六进制字符串)表示的 Buffer。但是,根据 windows-shortcuts 的文档或实现,这可能并不总是正确的。您需要查看该库的实际输出,并确定如何从它那里获取包含文件路径的原始 Buffer。

如果 windows-shortcuts 不提供这样的 Buffer,或者它内部以某种方式错误地处理了编码,那么您可能需要寻找一个更合适的库,或者自己编写代码来解析 .lnk 文件的二进制结构。这通常涉及对 Windows 快捷方式文件格式的深入了解,这可能会相当复杂。

 类似资料:
  • 本文向大家介绍解决nodejs中使用http请求返回值为html时乱码的问题,包括了解决nodejs中使用http请求返回值为html时乱码的问题的使用技巧和注意事项,需要的朋友参考一下 今天用nodejs进行http请求时返回的数据是一个html文件,然后我还是按照以前解析json数据的方法。果不其然报错了:SyntaxError: Unexpected token  in JSON at po

  • 由vue-cli3.0创建的vue2.0项目 使用echarts制作3D 饼图时,在main.js中引ecarhts-gl后出现警告 ` import * as echarts from 'echarts' import 'echarts-gl' ` 这是为什么,如何解决这个警告 暂无

  • 引入第三方js跨域问题,如何解决? 项目中引入了“天地图”js库, 但是自己的站点是“https”协议,发布站点后,发现请求的库里面重定向到了“http”开头的地址,导致引入该库报错,导致无法使用天地图, 演示: 访问官方demo:http://lbs.tianditu.gov.cn/api/js4.0/examples.html 打开f12,你能看到都是重定向(307)的http,哪怕你把例子中

  • 本文向大家介绍java中文传值乱码问题的解决方法,包括了java中文传值乱码问题的解决方法的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了java中文传值乱码问题,以及解决方法,供大家参考,具体内容如下 一般编码格式设置: 1.可以经过两次编码处理,即设置字符集后,在插入前解码字符集,也是最有效的方式 设置字符集: 解码字符集: 2.直接处理: userName = new Stri

  • 本文向大家介绍JSP服务器端和前端出现乱码问题解决方案,包括了JSP服务器端和前端出现乱码问题解决方案的使用技巧和注意事项,需要的朋友参考一下 这篇文章主要介绍了JSP服务器端和前端出现乱码问题解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 在前端和服务器端交互的过程中主要是通过HTTP协议进行交互的,而在Servlet接口中有提供一个H

  • 本文向大家介绍SqlServer数据库中文乱码问题解决方法,包括了SqlServer数据库中文乱码问题解决方法的使用技巧和注意事项,需要的朋友参考一下 问题:创建新数据库,存入中文显示乱码??? 原因分析:SQL版的乱码问题还是出现在SQL SERVER的安装设置上。默认安装时系统默认的排序规则是拉丁文的排序规则,但一般人在安装时没有考虑到这一点,安装时只是点取下一步,安装完成后,造成了SQL版在