node.js - 如何通过exec进程在node js中强制UTF-8?

标签 node.js utf-8 exec utf-16

我知道解决方案非常简单,但我花了一个小时才解决这个问题。

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/

相关文章:

node.js - 如何修复 'Content Security Policy: The page’ s 设置阻止在 http ://localhost:8080/favicon. ico (“default-src” 处加载资源。'

ruby - 添加反斜杠以修复 ruby​​ 字符串中的字符编码

Windows 上的 R : character encoding hell

python - 为什么在函数内部调用时 exec() 的工作方式不同以及如何避免它

node.js - 如何在 Telegram 中使用内联键盘创建分页

mysql - 我们可以使用 Nodejs ORM2 从 MySql 获取表模型而不定义所有属性/字段吗?

javascript - Express + Angular,始终发送 html 请求的索引文件,而不是 api 请求

java - 来自 Servlet 的字符串,带有 XML CDATA 中的控制字符

python - 不受信任的用户不应运行哪些内置函数?

linux - 递归地在子文件夹中添加新文件