我知道解决方案非常简单,但我花了一个小时才解决这个问题。
在Windows 10中,如果我启动命令“dir”,我会得到以下结果:
Il Volume nell'unità D non ha etichetta.
在Node js中,我尝试以这种方式执行 dir 命令:
var child = exec('dir', {'encoding': 'UTF-8'}, (err, stdout, stderr) => {
console.log(stdout);
});
我得到了这个结果: Il Volume nell'unit. C non ha etichetta.
啊,该死的带口音的字母!
我尝试使用 UTF-16,然后转换为字符串:
var child = exec('dir', {'encoding': 'UTF-16'}, (err, stdout, stderr) => {
let b: Buffer = stdout;
let o: string;
o = stdout.toString('UTF-8');
console.log(o);
});
我得到了同样的诅咒结果:
“Il Volume nell'unit� C non ha etichetta。”
你能帮我解决这个谜题吗? 我做错了什么?
看起来 exec 命令不接受 UTF-8 编码 事实上,如果我运行此脚本来强制从 UTF-8 转换为字符串:
var child = exec(j.cmd, {'encoding': 'UTF-8'}, (err, stdout, stderr) => {
var utf8 = require('utf8');
var o: string = utf8.decode(stdout)
console.log(o);
});
我收到此错误:
..\node_modules\utf8\utf8.js:194 throw Error('检测到无效的 UTF-8');
有什么想法吗?
最佳答案
当您在命令提示符中使用 dir 时,渲染器知道标准输出正在使用哪种字符编码,解码文本字节并使用所选字体渲染字符。
当你执行一个命令时, Node 不知道stdout正在使用哪种字符编码,所以你告诉它。问题是你告诉它错误的事情。要查看它是哪种字符编码,请转到 chcp
。但是,开箱即用的, Node 仅支持数十种字符编码中的一些。
解决方案是告诉命令提示符使用它们共有的一个。由于您是从文件系统获取路径,并且文件系统 (NTFS) 使用 Unicode 字符集作为路径,因此 UTF-8 是一个不错的选择。
所以,这应该有效:
exec('@chcp 65001 >nul & dir', {encoding: "UTF-8"},
(err, stdout, stderr) => console.log(stdout));
但是,chcp 命令具有延迟效果,并且不适用于 dir 命令。这是解决这个问题的一种方法:
exec('@chcp 65001 >nul & cmd /d/s/c dir', {encoding: "UTF-8"},
(err, stdout, stderr) => console.log(stdout));
运行批处理文件可能是一种更简单的方法,可以让两个单独的命令运行并具有顺序效果,但这需要设置和清理。
关于node.js - 如何通过exec进程在node js中强制UTF-8?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46603489/