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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在Windows命令行中使用unicode字符?相关的知识,希望对你有一定的参考价值。

我们在Team Foundation Server(TFS)中有一个项目,其中包含非英语字符(š)。当我试图编写一些与构建相关的东西时,我们偶然发现了一个问题 - 我们无法将š字母传递给命令行工具。命令提示符或其他什么不是搞砸了,并且tf.exe实用程序找不到指定的项目。

我尝试过.bat文件的不同格式(ANSI,带有和不带BOM的UTF-8)以及用javascript编写脚本(这本身就是Unicode) - 但没有运气。如何执行程序并将其传递给Unicode命令行?

答案

我的背景:我在控制台中使用Unicode输入/输出多年(并且每天都做很多。此外,我正在为这项任务开发支持工具)。只要您了解以下事实/限制,就会遇到很少的问题:

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

The details

  • 要读取/写入控制台的Unicode,应用程序(或其C运行时库)应该足够聪明,不能使用File-I/O API,而应使用Console-I/O API。 (例如,请参阅how Python does it。)
  • 同样,要读取Unicode命令行参数,应用程序(或其C运行时库)应足够智能以使用相应的API。
  • 控制台字体渲染仅支持BMP中的Unicode字符(换句话说:在U+10000下面)。仅支持简单的文本呈现(因此欧洲 - 以及一些东亚语言 - 应该可以正常工作 - 只要使用预先组合的表单)。 [这里有东亚的minor fine print和U + 0000,U + 0001,U + 30FB的字符。]

Practical considerations

  • Window上的默认值不是很有用。为了获得最佳体验,应该调整3个配置: 输出:全面的控制台字体。为了获得最佳效果,我推荐my builds。 (安装说明存在于此页面中,并在本页的其他答案中列出。) 输入:有能力的键盘布局。为了获得最佳效果,我推荐my layouts。 输入:allow HEX input of Unicode
  • 还有一个问题是“粘贴”到控制台应用程序中(非常技术性): HEX输入在KeyUpAlt上提供了一个角色;所有其他提供角色的方式都发生在KeyDown上;如此多的应用程序还没有准备好在KeyUp上看到一个角色。 (仅适用于使用Console-I/O API的应用程序。) 结论:许多应用程序不会对HEX输入事件做出反应。 此外,“粘贴”字符所发生的情况取决于当前的键盘布局:如果可以在不使用前缀键的情况下键入字符(但使用任意复杂的修饰符组合,如Ctrl-Alt-AltGr-Kana-Shift-Gray*),则会在模拟按键上传递。这是任何应用程序所期望的 - 所以粘贴任何只包含这些字符的东西都可以。 但是,通过模拟HEX输入来传递“其他”字符。 结论:除非您的键盘布局支持输入大量没有前缀键的字符,否则当您通过Console的UI Paste时,一些错误的应用程序可能会跳过字符:Alt-Space E P。 (这就是我推荐使用键盘布局的原因!)

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

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


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

Summary

  • 设置字体,键盘布局(以及可选的,允许HEX输入)。
  • 仅使用通过Console-I/O API的程序,并接受Unicode命令行参数。例如,任何cygwin编译的程序都应该没问题。正如我已经说过的那样,CMD也很好。

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

另一答案

对于类似的问题,(我的问题是在命令提示符下显示来自mysql的UTF-8字符),

我这样解决了:

  1. 我将命令提示符的字体更改为Lucida Console。 (这一步必须与你的情况无关。它只能与你在屏幕上看到的一样,而不是与真正的角色有关)。
  2. 我将代码页更改为Windows-1253。您可以在命令提示符下通过“chcp 1253”执行此操作。它适用于我希望看到UTF-8的情况。
另一答案

我发现这种方法在新版Windows 10中很有用:

启用此功能:“测试版:使用Unicode UTF-8进行全球语言支持”

控制面板 - >区域设置 - >管理选项卡 - >更改系统区域设置...

Region Settings

另一答案

这个问题很烦人。我的文件名和文件内容通常都有中文字符。请注意我使用的是Windows 10,这是我的解决方案:

如果在Windows 10上安装了Ubuntu bash,则显示文件名,例如dirls

  1. 设置区域以支持非utf 8字符。
  2. 之后,控制台的字体将更改为该区域设置的字体,并且还会更改控制台的编码。

完成上述步骤后,使用命令行工具显示UTF-8文件的文件内容

  1. 通过chcp 65001将页面更改为utf-8
  2. 更改为支持utf-8的字体,例如Lucida Console
  3. 使用type命令查看文件内容,如果在Windows 10上安装了Ubuntu bash,则使用cat
  4. 请注意,在将控制台的编码设置为utf-8后,我无法使用中文输入法在cmd中键入中文字符。

最懒的解决方案:只需使用控制台模拟器,如http://cmder.net/

另一答案

如果您在DOS窗口中键入路径/文件名时计算机显示正确的路径/文件名,则快速决定.bat文件:

  1. copy con temp.txt [按Enter键]
  2. 输入路径/文件名[按Enter键]
  3. 按Ctrl-Z [按Enter]

这样就可以创建一个.txt文件 - temp.txt。在记事本中打开它,复制文本(不要担心它看起来不可读)并将其粘贴到.bat文件中。在DOS窗口中执行以这种方式创建的.bat为mе(Cyrillic,Bulgarian)工作。

另一答案

更清洁的事情:只需安装可用的免费Microsoft日语语言包即可。 (其他东方语言包也可以使用,但我测试了日语。)

这将为您提供具有较大字形集的字体,使其成为默认行为,更改各种Windows工具,如cmd,写字板等。

另一答案

将代码页更改为1252对我有用。对我来说问题是符号双doller§在Windows Server 2008上由DOS转换为另一个符号。

我在我的BCP声明中使用过CHCP 1252和一个上限^§。

另一答案

我在这里看到了几个答案,但它们似乎没有解决这个问题 - 用户希望从命令行获取Unicode输入。

Windows使用UTF-16进行两个字节字符串的编码,因此您需要从程序中的操作系统中获取这些字符串。有两种方法可以做到这一点 -

1)Microsoft有一个扩展,允许main接受一个宽字符数组:int wmain(int argc,wchar_t * argv []); https://msdn.microsoft.com/en-us/library/6wd819wh.aspx

2)调用windows api获取命令行的unicode版本wchar_t win_argv =(wchar_t)CommandLineToArgvW(GetCommandLineW(),&nargs); https://docs.microsoft.com/en-us/windows/desktop/api/shellapi/nf-shellapi-commandlinetoargvw

阅读:http://utf8everywhere.org获取详细信息,特别是如果您支持其他操作系统。

另一答案

从2019年6月开始,使用Windows 10,您无需更改代码页。

参见“Introducing Windows Terminal”(来自Kayla Cinnamon)和Microsoft/Terminal。 通过使用Consolas字体,将提供部分Unicode支持。

Microsoft/Terminal issue 387所述:

目前有Unicode的87,887个表意文字。你也需要所有这些吗? 我们需要一个边界,超出该边界的字符应该由字体回退/字体链接/其他来处理。

Consolas应涵盖的内容:

  • 用作CLI中现代OSS程序使用的符号的字符。
  • 这些角色应遵循Consolas的设计和指标,并与现有的Consolas角色正确对齐。

Consolas不应该涵盖的内容:

  • 除拉丁语,希腊语和西里尔语之外的脚本的字符和标点符号,特别是字符需要复杂的形状(如阿拉伯语)。
  • 应使用字体回退处理这些字符。
另一答案

我通过短文件(8点3)名称在批处理文件中引用它们来解决类似的删除Unicode命名文件的问题。

可以通过dir /x查看短名称。显然,这仅适用于已知的Unicode文件名。

另一答案

对于utf-8:chcp 65001

回到默认值:chcp 437

另一答案

尝试:

chcp 65001

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

另一答案

我有同样的问题(我来自捷克共和国)。我有一个Windows的英文版,我必须使用共享驱动器上的文件。文件的路径包括特定于捷克语的字符。

适合我的解决方案是:

在批处理文件中,更改charset页面

我的批处理文件:

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

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

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

以上是关于如何在Windows命令行中使用unicode字符?的主要内容,如果未能解决你的问题,请参考以下文章

WINDOWS 2000 SEVER 命令行中都有哪些命令

如何使用 unicode 版本的 Windows API:mciSendString()、Python

Windows 7 中文版命令行如何修改字符编码为UTF-8?

Windows如何在cmd命令行中查看、修改、删除与添加、设置环境变量?

如何在 Windows 的命令行中使用 MinGW 编译器?

如何在 Windows 命令行中使用参数运行 Python 脚本