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

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

我尝试了不同格式的.bat文件(ANSI, UTF-8,有物料清单和没有物料清单),以及用JavaScript编写脚本(本质上是Unicode) -但运气不好。如何执行程序并传递Unicode命令行?

527804 次浏览

试一试:

chcp 65001

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

实际上,关键在于命令提示符实际上理解这些非英语字符,只是不能正确地显示它们。

当我在命令提示符中输入包含一些非英语字符的路径时,它显示为“?? ?”?????? ? ?”当您提交命令(cd "???????? ?????”在我的情况下),一切都按照预期工作。

我也有同样的问题(我来自捷克共和国)。我安装了英文的Windows,而且我必须使用共享驱动器上的文件。文件的路径包含捷克特有的字符。

适合我的解决方案是:

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

批处理文件:

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

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

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

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

我是这样解决的:

  1. 我把命令提示符的字体改成了Lucida Console。(此步骤必须与您的情况无关。它只与你在屏幕上看到的东西有关,而与角色本身无关)。

  2. 我把代码页改成了Windows-1253。您可以在命令提示符中通过“chcp 1253”执行此操作。它适用于我想要查看UTF-8的情况。

检查非unicode程序的语言。如果你在Windows控制台中有俄语问题,那么你应该在这里设置俄语:

更改非unicode程序的语言

一个更好更干净的方法是:安装可用的免费微软日语包。(其他东方语言包也可以,但我已经测试了日语包。)

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

把代码页改成1252对我有用。我遇到的问题是,Windows Server 2008上的DOS正在将符号double doller§转换为另一个符号。

在我的BCP声明^§中,我使用了CHCP 1252和它之前的一个帽。

一个快速决定。bat文件,如果你的电脑显示你的路径/文件名正确时,你在dos窗口输入:

  1. copy con temp.txt .txt [press Enter]
  2. 输入路径/文件名[按Enter]
  3. < em > ctrl - z < / em >[按Enter]
这样你就创建了一个。txt文件- temp.txt。在记事本中打开它,复制文本(不要担心它看起来不可读),并粘贴到你的。bat文件中。 在DOS-window中执行以这种方式创建的.bat对mе(西里尔语,保加利亚语)有效

更改Windows控制台的默认Codepage是相当困难的。当你在网上搜索时,你会发现不同的建议,然而其中一些可能会完全破坏你的Windows,即你的PC无法再启动。

最安全的解决方案是: 转到你的注册表键HKEY_CURRENT_USER\Software\Microsoft\Command Processor,并添加字符串值Autorun = chcp 65001.

或者,对于最常见的代码页,可以使用这个小的批处理脚本。

@ECHO off


SET ROOT_KEY="HKEY_CURRENT_USER"




FOR /f "skip=2 tokens=3" %%i in ('reg query HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\CodePage /v OEMCP') do set OEMCP=%%i


ECHO System default values:


ECHO.
ECHO ...............................................
ECHO Select Codepage
ECHO ...............................................
ECHO.
ECHO 1 - CP1252
ECHO 2 - UTF-8
ECHO 3 - CP850
ECHO 4 - ISO-8859-1
ECHO 5 - ISO-8859-15
ECHO 6 - US-ASCII
ECHO.
ECHO 9 - Reset to System Default (CP%OEMCP%)
ECHO 0 - EXIT
ECHO.




SET /P  CP="Select a Codepage: "


if %CP%==1 (
echo Set default Codepage to CP1252
reg add "%ROOT_KEY%\Software\Microsoft\Command Processor" /v Autorun /t REG_SZ /d "@chcp 1252>nul" /f
) else if %CP%==2 (
echo Set default Codepage to UTF-8
reg add "%ROOT_KEY%\Software\Microsoft\Command Processor" /v Autorun /t REG_SZ /d "@chcp 65001>nul" /f
) else if %CP%==3 (
echo Set default Codepage to CP850
reg add "%ROOT_KEY%\Software\Microsoft\Command Processor" /v Autorun /t REG_SZ /d "@chcp 850>nul" /f
) else if %CP%==4 (
echo Set default Codepage to ISO-8859-1
add "%ROOT_KEY%\Software\Microsoft\Command Processor" /v Autorun /t REG_SZ /d "@chcp 28591>nul" /f
) else if %CP%==5 (
echo Set default Codepage to ISO-8859-15
add "%ROOT_KEY%\Software\Microsoft\Command Processor" /v Autorun /t REG_SZ /d "@chcp 28605>nul" /f
) else if %CP%==6 (
echo Set default Codepage to ASCII
add "%ROOT_KEY%\Software\Microsoft\Command Processor" /v Autorun /t REG_SZ /d "@chcp 20127>nul" /f
) else if %CP%==9 (
echo Reset Codepage to System Default
reg delete "%ROOT_KEY%\Software\Microsoft\Command Processor" /v AutoRun /f
) else if %CP%==0 (
echo Bye
) else (
echo Invalid choice
pause
)

使用@chcp 65001>nul而不是chcp 65001会抑制每次启动一个新的命令行窗口时都会得到的输出“活动代码页:65001”。

代码页标识符中可以获得的所有可用数字的完整列表

注意,设置只适用于当前用户。如果你想为所有用户设置它,用SET ROOT_KEY="HKEY_LOCAL_MACHINE"替换行SET ROOT_KEY="HKEY_CURRENT_USER"

我通过在批处理文件中使用它们的短名称(8点3)来删除以unicode命名的文件,从而避免了类似的问题。

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

一个非常简单的选项是安装一个Windows bash shell,例如MinGW,并使用它:

Enter image description here

有一点学习曲线,因为你将需要使用Unix命令行功能,但你会喜欢它的力量,你可以将控制台字符集设置为UTF-8。

Enter image description here

当然,您还可以得到所有常见的*nix好东西,如grep、find、less等。

由于我还没有看到Python 2.7的完整答案,我将概述两个重要步骤和一个非常有用的可选步骤。

  1. 您需要一种支持Unicode的字体。Windows自带Lucida控制台,可以通过命令提示符的右键单击标题栏进行选择,并单击Defaults选项。这也提供了颜色的访问。注意,您还可以通过选择Properties来更改以某些方式调用的命令窗口的设置(例如,在这里打开,Visual Studio)。
  2. 您需要将代码页设置为cp65001,这似乎是微软试图为命令提示符提供UTF-7和UTF-8支持。通过运行chcp 65001在命令提示符来做到这一点。一旦设置,它将保持这种方式,直到窗口关闭。每次启动cmd.exe时都需要重新执行此操作。

要获得更永久的解决方案,请参考Super User上的这个答案。简而言之,在HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor处使用regedit创建一个REG_SZ (String)条目,并将其命名为AutoRun。将其值更改为chcp 65001。如果不想看到命令的输出消息,可以使用@chcp 65001>nul代替。

有些程序在与这种编码进行交互时遇到麻烦,MinGW就是一个显著的例子,它在编译时出现无意义的错误消息而失败。尽管如此,这工作得非常好,并且不会对大多数程序造成错误。

在windows和nbsp;10 x64机器上,我通过以下方法使命令提示符显示非英语字符:

打开提升命令提示符(以管理员身份运行CMD.EXE)。通过以下方法查询控制台可用的TrueType字体的注册表:

    REG query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Console\TrueTypeFont"

你会看到如下输出:

    0    REG_SZ    Lucida Console
00    REG_SZ    Consolas
936    REG_SZ    *新宋体
932    REG_SZ    *MS ゴシック

现在我们需要添加一个TrueType字体,支持你需要的字符,如Courier New。我们通过在字符串名后面加0来实现,所以在这种情况下,下一个字符串将是"000":

    REG ADD "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Console\TrueTypeFont" /v 000 /t REG_SZ /d "Courier New"

现在我们实现了UTF-8支持:

    REG ADD HKCU\Console /v CodePage /t REG_DWORD /d 65001 /f

设置默认字体为Courier New:

    REG ADD HKCU\Console /v FaceName /t REG_SZ /d "Courier New" /f

设置字体大小为20:

    REG ADD HKCU\Console /v FontSize /t REG_DWORD /d 20 /f

启用快速编辑,如果你喜欢:

    REG ADD HKCU\Console /v QuickEdit /t REG_DWORD /d 1 /f

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

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

  1. 设置该区域支持非utf8字符。

  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/

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

  • CMD和“控制台”是不相关的因素。CMD.exe只是一个可以在控制台(“控制台应用程序”)中“工作”的程序之一。
  • AFAIK, CMD完美支持Unicode;当任何 codepage激活时,你可以输入/输出所有的Unicode字符。
  • Windows的控制台对Unicode有很多支持——但它并不完美(只是“足够好”;见下文)。
  • chcp 65001是非常危险的。除非一个程序是专门设计来解决Windows API中的缺陷(或者使用具有这些解决方法的C运行时库),否则它不会可靠地工作。Win8通过cp65001修复了其中的1 / 2个问题,但其余问题仍然适用于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
    • 李< / ul > < / >
    • “粘贴”到控制台应用程序的另一个问题(非常技术化):

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

      结论< em > < / em >:除非你的键盘布局支持大量没有前缀键的字符输入,否则当你通过控制台的UI: Alt-Space E P Paste时,一些有bug的应用程序可能会跳过字符。(是为什么我建议使用我的键盘布局!)

    还应该记住,Windows 难道这不是主机吗的“替代的,更强大的”控制台”。它们不支持Console-I/O api,因此依赖这些api工作的程序将无法正常工作。(不过,只使用“文件- i /O api到控制台文件句柄”的程序可以很好地工作。)

    微软Powershell的一部分就是这样一个非主机的例子。我不用它;要进行实验,请按下并释放WinKey,然后键入powershell


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

    总结

    • 设置字体,键盘布局(并可选地,允许十六进制输入)。

    • 只使用经过Console-I/O api的程序,并接受Unicode命令行参数。例如,任何__abc1编译的程序都可以。正如我已经说过的,CMD也很好。

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

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

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

1)微软有一个扩展,允许main采用宽字符数组: Int wmain(Int argc, wchar_t *argv[]); https://msdn.microsoft.com/en-us/library/6wd819wh.aspx < / p >

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

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

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

打开此功能:"Beta版:使用Unicode UTF-8支持全球语言"

控制面板->区域设置->管理选项卡->修改 系统区域设置…< / p >

Region Settings

从2019年6月开始,使用Windows 10,你将不必更改代码页。

参见"Windows终端介绍" (from < >强凯拉肉桂< / >强)和< >强微软/终端< / >强.
通过使用Consolas字体,将提供部分 Unicode支持

Microsoft/Terminal issue 387中所述:

目前Unicode中有87,887个表意文字。你也需要全部吗?< br > 我们需要一个边界,超出边界的字符应该通过字体回退/字体链接/其他方式来处理

Consolas应该包括什么:

  • 现代OSS程序在CLI中用作符号的字符。
  • 这些角色应该遵循Consolas的设计和指标,并与现有的Consolas角色保持一致。

Consolas不应该涵盖的内容:

  • 除了拉丁、希腊文和西里尔文之外,文字的字符和标点符号,尤其是需要复杂形状的字符(如阿拉伯语)。
  • 这些字符应该用字体回退处理。

注意,对于那些使用WSL的人,他们也不想要来自Cygwin或Git的额外包,wsltty是可用的,它只提供支持UTF-8的终端