在 Windows 上,控制台中有一些基本的表情符号支持,因此我可以在键入时获得单色字形,例如☕
或 📜
。我可以从 PowerShell 或 C# 控制台应用程序或 Python 输出字符串,它们都可以很好地显示这些字符。
但是,从 Node.js 中,我只能显示几个表情符号(例如 ☕
),而不能显示其他(而不是 📜
我看到 >�
)。但是,如果我 throw
包含这些字符的字符串,它们会正确显示。
console.log(' 📜 ☕ ');
throw ' 📜 ☕ ';
如果我运行上面的脚本,输出是
� ☕ C:\Code\emojitest\emojitest.js:2 throw ' 📜 ☕ '; ^ 📜 ☕
无论如何我可以正确输出这些表情符号而不会引发错误?还是该异常发生在我可以通过标准 Node.js API 获得的功能之外?
最佳答案
如果不更改libuv,您想要的可能无法实现。当你(或
控制台)写入 Windows 上的 stdout
或 stderr
并且流是 TTY,
libuv 会自己进行从 UTF-8 到 UTF-16 的转换。在这样做时,它明确
拒绝输出代理对,而是发出替换字符
U+FFFD
� 适用于 BMP 之外的任何代码点。
这是 uv/src/win/tty.c 中的罪魁祸首:
/* We wouldn't mind emitting utf-16 surrogate pairs. Too bad, the */
/* windows console doesn't really support UTF-16, so just emit the */
/* replacement character. */
if (utf8_codepoint > 0xffff) {
utf8_codepoint = UNICODE_REPLACEMENT_CHARACTER;
}
throw
消息正确显示,因为 Node 允许 Windows 执行
使用 MultiByteToWideChar()
从 UTF-8 到 UTF-16 的转换(确实会发出
代理对)在将消息写入控制台之前。 (看
PrintErrorString()
in src/node.cc .)
注意:A pull request已提交解决此问题。
关于node.js - 如何在 Node.js(在 Windows 上)中将表情符号输出到控制台?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44054983/