为了账号安全,请及时绑定邮箱和手机立即绑定

如何在Windows命令行中使用unicode字符?

如何在Windows命令行中使用unicode字符?

萧十郎 2019-05-25 17:13:43
如何在Windows命令行中使用unicode字符?我们在Team Foundation Server(TFS)中有一个项目,其中包含非英语字符(š)。当我试图编写一些与构建相关的东西时,我们偶然发现了一个问题 - 我们无法将š字母传递给命令行工具。命令提示符或其他什么不是搞砸了,并且tf.exe实用程序找不到指定的项目。我已经尝试了.bat文件的不同格式(ANSI,带有和不带BOM的 UTF-8 )以及用JavaScript编写脚本(这本身就是Unicode) - 但没有运气。如何执行程序并将其传递给Unicode命令行?
查看完整描述

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/OAPI,而应使用Console-I/OAPI。(例如,看看Python是如何做到的。)

  • 同样,要读取Unicode命令行参数,应用程序(或其C运行时库)应足够智能以使用相应的API。

  • 控制台字体渲染仅支持BMP中的Unicode字符(换句话说:下面U+10000)。仅支持简单的文本呈现(因此欧洲 - 以及一些东亚语言 - 应该可以正常工作 - 只要使用预先组合的表单)。[有一个轻微的小字这里东亚和字符U + 0000,U + 0001,U + 30FB。]

实际考虑

  • Window上的默认值不是很有用。为了获得最佳体验,应该调整3个配置:

    • 输出:全面的控制台字体。为了获得最佳效果,我推荐我的版本。(安装说明存在于此页面中,并在本页的其他答案中列出。)

    • 输入:有能力的键盘布局。为了获得最佳效果,我推荐我的布局

    • 对于输入:允许Unicode的HEX输入

  • 还有一个问题是“粘贴”到控制台应用程序中(非常技术性):

    结论:除非您的键盘布局支持输入大量没有前缀键的字符,否则当您通过Console的UI时,一些错误的应用程序可能会跳过字符PasteAlt-Space E P。(就是我推荐使用键盘布局的原因!)

    • HEX输入提供上的字符KeyUpAlt所有其他提供角色的方式都会发生KeyDown; 如此多的应用程序还没有准备好看到一个角色KeyUp。(仅适用于使用Console-I/OAPI的应用程序。)

    • 结论:许多应用程序不会对HEX输入事件做出反应。

    • 此外,“粘贴”字符所发生的情况取决于当前的键盘布局:如果可以在不使用前缀键的情况下键入字符(但使用任意复杂的修饰符组合,Ctrl-Alt-AltGr-Kana-Shift-Gray*则如此),则会在模拟按键上传递。这是任何应用程序所期望的 - 所以粘贴任何只包含这些字符的东西都可以。

    • 但是,通过模拟HEX输入来传递“其他”字符。

还应该记住,Windows的“替代”,“更有能力”的控制台根本不是游戏机。它们不支持Console-I/OAPI,因此依赖这些API工作的程序将无法运行。(但是,只使用“文件I / O API到控制台文件句柄”的程序可以正常工作。)

这种非控制台的一个例子是MicroSoft的一部分Powershell。我不用这个; 进行实验,按下并释放WinKey,然后键入powershell


(另一方面,有一些程序,例如ConEmuANSICON试图做更多的程序:它们“试图”拦截Console-I/OAPI以使“真正的控制台应用程序”也起作用。这绝对适用于玩具示例程序;在现实生活中,这可能或可能无法解决您的特定问题。实验。)

摘要

  • 设置字体,键盘布局(以及可选的,允许HEX输入)。

  • 仅使用通过Console-I/OAPI的程序,并接受Unicode命令行参数。例如,任何cygwin编译的程序应该没问题。正如我已经说过的,CMD也很好。

UPD:最初,对于一个错误cp65001,我混淆了内核和CRTL层(UPD²:和Windows用户模式API!)。 另外: Win8修复了这个bug的一半; 我澄清了关于“更好的控制台”应用程序的部分,并添加了对Python如何做的参考。



查看完整回答
反对 回复 2019-05-25
?
千巷猫影

TA贡献1829条经验 获得超7个赞

尝试:

chcp 65001

这会将代码页更改为UTF-8。此外,您需要使用Lucida控制台字体。


查看完整回答
反对 回复 2019-05-25
  • 4 回答
  • 0 关注
  • 2576 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信