【发布时间】:2015-12-23 18:03:05
【问题描述】:
在 Windows (10) 机器上,为什么我可以在某些地方打印“黑旗”(U+2691) 字符而在其他地方不能打印(尤其是 cmd.exe)?
更新 cmets 中的建议提示(尚无答案): - [来自 Kevin] CMD.exe Unicode 支持是可疑的(未指定,但注销我遇到的奇怪 CMD.exe 行为的问题) - [来自 Mark] 进程应该写入 ConsoleAPI 而不是 stdout。 - [来自李斯特先生] 更改字体。
我更改了 Webstorm 中的字体。它使用monospaced,并正确显示了标志。我切换到Consolas、Lucida Sans 和Courier New,并且它们都适用。我查看了the list of supported unicode chars for Lucida Console,确实,U+2691 不在那里。所以 Webstorm 可能有一些后备机制来支持这个角色。
我运行 ConEmu,将基本字体设置为 Lucida Console,将替代字体设置为 DejaVu Sans,我从 here 下载。我不得不手动调整 Unicode 范围,将其设置为 2013-3000。瞧,黑旗出现了。因此,尽管第一部分现在(种类)已解决,但我仍然不知道这里的字体与图形和代码页发生了什么。我认为在处理一些 unicode 时代码页是一个红鲱鱼......所以,如果有人有任何确定的东西,我会喜欢一个正确的答案。 ;-)
注意,我将 cmd.exe 字体设置为 Lucida 控制台,将当前代码页设置为 (UTF-8) 65001。我还尝试了其他字体...和 chcp 1252。是的,我已阅读 the Spolsky post , 这是极好的。我认为我缺少的是 Kevin 在评论中所说的(cmd.exe 没有 proper Unicode 支持)以及 Mark 关于绕过 stdout 的话。这解释了 cmd.exe,但很想了解更多关于 VS、VS Code、NP++ 的信息...
我可以在 chrome 中看到很好的字符:
http://graphemica.com/⚑
http://graphemica.com/%E2%9A%91
我可以在其中一个中看到它:
- Office(Word、Outlook)
- 网络风暴
- Visual Studio
但是,我在这里看不到它(显示为一个框):
- 记事本++
- Visual Studio 代码
- cmd.exe
如果我在节点中运行它:
console.log('\u2691:', '\u2691');
console.log('Flag:', '⚑')
它只是转储盒子(当我在这里复制和粘贴时很好)。
然后还有其他字符,例如:重对号(U+2714)
http://graphemica.com/%E2%9C%94 http://graphemica.com/✔
在 Visual Studio Code 中“显示”(无法显示标志)但不会显示在 cmd.exe 中。
这里似乎有很多活动部分:Unicode、字符代码、代码页、字体等等。
有人可以帮我解决这个问题吗?这里到底发生了什么?
为什么字符在某些地方显示而在其他地方不显示?
有什么办法可以显示 cmd.exe 中的字符吗?
【问题讨论】:
-
启动 here 并知道 cmd.exe 没有正确的 Unicode 支持。
-
在
cmd.exe中显示 Unicode 字符需要直接使用控制台 API 并绕过标准输出。 -
这个问题出在字体上。 Lucida Console 不包含 ⚑ 或 ✔ 字符。如果您必须使用 cmd.exe,请选择可以使用的字体。或者使用 charmap.exe 检查 Lucida Console 包含的字符并使用其中之一。
-
回答你的cmets,有些程序在显示字符方面比其他程序更好。例如,图形程序通过切换到另一种字体来做到这一点。文本模式程序没有这样的功能!
-
@MrLister 是对的。您需要手动选择合适的字体供
cmd、Notepad等使用(例如,DejaVu Sans Mono包含的字符字形比常用的Courier或Lucida Console等宽字体要多得多) .
标签: windows unicode utf-8 cmd character-encoding