node-font-list icon indicating copy to clipboard operation
node-font-list copied to clipboard

中文乱码

Open jerrychan7 opened this issue 5 years ago • 7 comments

当前版本:1.2.11 当前系统:win10 当前nodejs:12.13.0

#13 中提到的强制使用utf8代码页chcp 65001并不是一个万能的解决方案。在我的电脑中这并不能按照预期工作,还是有乱码:

215: ""Yu Gothic UI Semilight""
216: ""Yu Gothic UI""
217: ""Yu Gothic""
218: "΢ܛ�����w"
219: ""΢ܛ�����w Light""
220: "΢���ź�"
221: ""΢���ź� Light""
222: "�¼����w-ExtB"
223: "��Բ"
224: "���IJ���"
225: "�����"

在其他项目中也有类似的情况,例如wmic,但都不清楚问题的原因是什么,这里提到的可能是由于控制台使用的是矢量字体的原因,我尝试过切换字体,但一样不能工作。(也许是因为vs code的原因?因为就算我切换字体vs code里终端的字体也没变化)

目前我发现的一个较为可行的解决方案是使用iconv-lite进行编码转换:

const iconv = require("iconv-lite");
exec(cmd, { maxBuffer: 1024 * 1024 * 10, encoding: "binary" }, (err, stdout, stderr) => {
    let t = iconv.decode(Buffer.from(stdout, "binary"), "utf8");
    // if not include ‘�’
    if (!t.includes("\uFFFD")) stdout = t;
    else stdout = iconv.decode(Buffer.from(stdout, "binary"), "cp936");
    if (err) return reject(err);
    resolve(parse(stdout));
});

只判断是因为Buffer会将无法解析为utf8的字符变成�,参考。 由此得出一个通用的解决方案是通过使用chcp来获取当前活动页码,使用binary方式读取结果,最后使用iconv根据活动页码转换编码。

此外,通过vbs获取字体信息时,也存在乱码现象。但在处理返回结果的时候,把objFont.Name的结果给过滤掉了:

// libs/win32/getByVBS.js : line 21
a = a.map(i => {
    i = i
      .split('\t')[0]
      .split(path.sep)
    i = i[i.length - 1]

getByVBS.js这里后续的处理中处理的都是字体路径而非字体名,不知是否符合作者你的预期。

Ps. 通过powershell获取的结果中有空字符串,希望过滤一下。

jerrychan7 avatar Jun 22 '20 23:06 jerrychan7

请问这个问题在最新版中解决了吗?commit历史里没有找到相关信息

troyeguo avatar Jun 11 '21 10:06 troyeguo

我在我这边的虚拟机 win10 下没有重现这个问题,中文字体会显示为英文名字,所以暂时没有处理。 @troyeguo 如果你遇到问题,麻烦把有问题的字体名说一下,我安装测试下。

oldj avatar Jun 11 '21 11:06 oldj

我的电脑上一切正常,中文字体名可以正常显示,但这个issue里有人反馈了乱码问题,这会不会是powershell 版本的问题,https://github.com/troyeguo/koodo-reader/issues/160

troyeguo avatar Jun 12 '21 06:06 troyeguo

按 @qinshou2017 的方案改进了 Windows 下的处理,不过因为我这边一直没有重现问题,所以也不确定那个乱码问题是否解决了。 @troyeguo 你可以试试 v1.3.0 。

oldj avatar Jun 12 '21 08:06 oldj

您好,我升级到1.3.0之后,原来1.2.15可以正常显示的中文字体,现在也变成乱码。

捕获

troyeguo avatar Jun 14 '21 09:06 troyeguo

看来没有能稳定重现问题的环境还是不行……,我先改回原来的方案,等后面能重现了再研究改进。 😢

oldj avatar Jun 14 '21 09:06 oldj

同,1.2.11中文正常,但1.4.3乱码 直接复制这俩版本的命令到cmd执行倒是都正常

edit: 解决了,提了个pr #28

qishibo avatar Jan 13 '22 09:01 qishibo