4 回答
TA贡献1851条经验 获得超4个赞
我的背景:我在控制台中使用Unicode输入/输出多年(并且每天都做很多。此外,我正在为这项任务开发支持工具)。只要您了解以下事实/限制,就会遇到很少的问题:
CMD
和“控制台”是无关的因素。CMD.exe
是一个准备“在控制台内”工作的程序(“控制台应用程序”)。AFAIK,
CMD
完全支持Unicode; 您可以在任何代码页处于活动状态时输入/输出所有Unicode字符。Windows的控制台对Unicode有很多支持 - 但它并不完美(只是“足够好”;见下文)。
chcp 65001
是非常危险的。除非程序是专门设计用于解决Windows API中的缺陷(或使用具有这些变通方法的C运行时库),否则它将无法可靠地工作。 Win8修复了这些问题的½cp65001
,但其余的仍然适用于Win10。我在工作
cp1252
。正如我已经说过:要在控制台中输入/输出Unicode,不需要设置代码页。
细节
要将Unicode读/写到控制台,应用程序(或其C运行时库)应足够智能,不能使用
File-I/O
API,而应使用Console-I/O
API。(例如,看看Python是如何做到的。)同样,要读取Unicode命令行参数,应用程序(或其C运行时库)应足够智能以使用相应的API。
控制台字体渲染仅支持BMP中的Unicode字符(换句话说:下面
U+10000
)。仅支持简单的文本呈现(因此欧洲 - 以及一些东亚语言 - 应该可以正常工作 - 只要使用预先组合的表单)。[有一个轻微的小字这里东亚和字符U + 0000,U + 0001,U + 30FB。]
实际考虑
Window上的默认值不是很有用。为了获得最佳体验,应该调整3个配置:
输出:全面的控制台字体。为了获得最佳效果,我推荐我的版本。(安装说明存在于此页面中,并在本页的其他答案中列出。)
输入:有能力的键盘布局。为了获得最佳效果,我推荐我的布局。
对于输入:允许Unicode的HEX输入。
还有一个问题是“粘贴”到控制台应用程序中(非常技术性):
结论:除非您的键盘布局支持输入大量没有前缀键的字符,否则当您通过Console的UI时,一些错误的应用程序可能会跳过字符
Paste
:Alt-Space E P
。(这就是我推荐使用键盘布局的原因!)HEX输入提供上的字符
KeyUp
的Alt
; 所有其他提供角色的方式都会发生KeyDown
; 如此多的应用程序还没有准备好看到一个角色KeyUp
。(仅适用于使用Console-I/O
API的应用程序。)结论:许多应用程序不会对HEX输入事件做出反应。
此外,“粘贴”字符所发生的情况取决于当前的键盘布局:如果可以在不使用前缀键的情况下键入字符(但使用任意复杂的修饰符组合,
Ctrl-Alt-AltGr-Kana-Shift-Gray*
则如此),则会在模拟按键上传递。这是任何应用程序所期望的 - 所以粘贴任何只包含这些字符的东西都可以。但是,通过模拟HEX输入来传递“其他”字符。
还应该记住,Windows的“替代”,“更有能力”的控制台根本不是游戏机。它们不支持Console-I/O
API,因此依赖这些API工作的程序将无法运行。(但是,只使用“文件I / O API到控制台文件句柄”的程序可以正常工作。)
这种非控制台的一个例子是MicroSoft的一部分Powershell
。我不用这个; 进行实验,按下并释放WinKey
,然后键入powershell
。
(另一方面,有一些程序,例如ConEmu
或ANSICON
试图做更多的程序:它们“试图”拦截Console-I/O
API以使“真正的控制台应用程序”也起作用。这绝对适用于玩具示例程序;在现实生活中,这可能或可能无法解决您的特定问题。实验。)
摘要
设置字体,键盘布局(以及可选的,允许HEX输入)。
仅使用通过
Console-I/O
API的程序,并接受Unicode命令行参数。例如,任何cygwin
编译的程序应该没问题。正如我已经说过的,CMD
也很好。
UPD:最初,对于一个错误cp65001
,我混淆了内核和CRTL层(UPD²:和Windows用户模式API!)。 另外: Win8修复了这个bug的一半; 我澄清了关于“更好的控制台”应用程序的部分,并添加了对Python如何做的参考。
- 4 回答
- 0 关注
- 2576 浏览
添加回答
举报