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

2024-04-26 03:42:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我们在TeamFoundationServer(TFS)中有一个包含非英语字符(š)的项目。当尝试编写一些与构建相关的东西时,我们偶然发现了一个问题——我们不能将š字母传递给命令行工具。命令提示符或其他东西会把它弄乱,并且tf.exe实用程序找不到指定的项目。

我已经尝试了.bat文件的不同格式(ANSI,UTF-8,带或不带BOM)以及用JavaScript编写脚本(这本来就是Unicode),但没有成功。如何执行程序并将Unicode命令行传递给它?


Tags: 文件工具项目命令行实用程序tf格式字母
3条回答

尝试:

chcp 65001

这将把代码页改成UTF-8。另外,您需要使用Lucida控制台字体。

我也有同样的问题(我来自捷克共和国)。我有一个英文版的Windows安装程序,我必须在共享驱动器上处理文件。文件路径包括捷克语特定字符。

对我有效的解决方案是:

在批处理文件中,更改字符集页

我的批处理文件:

chcp 1250
copy "O:\VEŘEJNÉ\ŽŽŽŽŽŽ\Ž.xls" c:\temp

批处理文件必须保存在CP 1250中。

请注意,控制台不会正确显示字符,但会理解它们。。。

我的背景:多年来,我在控制台中使用Unicode输入/输出(而且每天都要这么做)。此外,我还为这项任务开发了支持工具)。就您了解的以下事实/限制而言,几乎没有问题:

  • CMD和“控制台”是不相关的因素。CMD.exe只是准备在控制台(“控制台应用程序”)中“工作”的程序之一。
  • AFAIK,CMD完全支持Unicode;当任何代码页处于活动状态时,可以输入/输出所有Unicode字符。
  • Windows的控制台对Unicode - 有很多支持,但它并不完美(只是“足够好”;见下文)。
  • chcp 65001非常危险。除非一个程序是专门为解决Windows的API中的缺陷而设计的(或者使用具有这些解决方法的C运行库),否则它将无法可靠地工作。Win8 fixes ½ of these problems with ^{}, but the rest is still applicable to Win10
  • 我在cp1252工作。我已经说过:要在控制台中输入/输出Unicode,不需要设置代码页。

细节

  • 要将Unicode读/写到控制台,应用程序(或其C运行库)应该足够聪明,不应该使用File-I/OAPI,而应该使用Console-I/OAPI。(有关示例,请参见how Python does it。)
  • 同样,要读取Unicode命令行参数,应用程序(或其C运行时库)应该足够聪明,可以使用相应的API。
  • 控制台字体呈现只支持BMP中的Unicode字符(换句话说:belowU+10000)。只支持简单的文本呈现(因此,欧洲语言和一些东亚语言只要使用预合成格式就可以正常工作)。[这里有一个minor fine print用于东亚和字符U+0000、U+0001、U+30FB。]

实际考虑

  • “打开”窗口中的“默认值”不是很有帮助。为了获得最佳体验,您应该调整3个配置:

    • 输出:一种综合的控制台字体。为了获得最佳结果,我建议my builds。(安装说明在 - 处,也列在本页的其他答案中。)
    • 输入:有能力的键盘布局。为了获得最佳结果,我建议my layouts
    • 输入:allow HEX input of Unicode
  • 在控制台应用程序中再“粘贴”一次(非常技术性):

    • 十六进制输入在AltKeyUp上传递字符;所有的传递字符的其他方式都发生在KeyDown;所以许多应用程序都没有准备好在KeyUp上看到字符。(仅适用于使用Console-I/OAPI的应用程序。)
    • 结论:许多应用程序不会对十六进制输入事件作出反应。
    • 此外,“粘贴”字符的情况取决于当前的键盘布局:如果可以在不使用前缀键的情况下键入字符(但可以使用任意复杂的修饰符组合,如Ctrl-Alt-AltGr-Kana-Shift-Gray*),则可以通过模拟的按键来传递。这是任何应用程序所期望的 - 所以粘贴任何只包含此类字符的内容都是可以的。
    • 但是,“其他”字符是通过模拟十六进制输入来传递的。

    结论:除非您的键盘布局支持输入大量不带前缀键的字符,否则当您通过控制台的UIPaste时,一些有缺陷的应用程序可能会跳过字符。(这就是我推荐使用键盘布局的原因!)

还应记住,用于Windows的“可选的、功能更强的”控制台根本不是控制台。它们不支持Console-I/Oapi,因此依赖这些api工作的程序将无法运行。(不过,那些只使用“控制台文件句柄的文件I/oapi”的程序可以正常工作。)

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

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

摘要

  • 设置字体、键盘布局(还可以选择允许十六进制输入)。

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

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

相关问题 更多 >