我们在Team Foundation Server(TFS)中有一个项目,其中包含非英语字符(Š)。当尝试脚本脚本一些与构建相关的事情时,我们偶然发现了一个问题 - 我们无法通过 š 命令行工具的信。命令提示或什么没有弄乱它, tf.exe 实用程序找不到指定的项目。

我尝试了.bat文件的不同格式(ANSI,UTF-8带有和不使用 bom)以及在JavaScript中拼写(本质上是Unicode) - 但没有运气。我如何执行程序并通过 Unicode 命令行?

有帮助吗?

解决方案

我的背景:我在控制台中使用Unicode输入/输出多年(并每天进行很多操作。此外,我为此任务开发了支持工具)。就您了解以下事实/局限性而言,有很少的问题:

  • CMD 和“控制台”是无关的因素。 CMD.exe 只是准备在控制台内“工作”(“控制台应用程序”)的程序之一。
  • AFAIK, CMD 对Unicode有完美的支持;您可以在 任何 CodePage处于活动状态。
  • Windows的控制台对Unicode有很大的支持 - 但它并不完美(“足够好”;见下文)。
  • chcp 65001 非常危险。除非专门设计的程序可以解决Windows API中的缺陷(或使用具有这些解决方法的C运行时库),否则它将无法可靠地工作。 Win8解决了这些问题的½ cp65001, ,但其余的仍然适用于Win10.
  • 我在...工作 cp1252. 。正如我已经说过的: 要在控制台中输入/输出Unicode,不需要设置CodePage.

细节

  • 要读/写Unicode到控制台,应用程序(或其C运行时库)应该足够聪明,可以使用 File-I/O API,但是 Console-I/O API。 (例如,请参见 Python如何做.)
  • 同样,要读取Unicode命令行参数,应用程序(或其C运行时库)应足够聪明,可以使用相应的API。
  • 控制台字体渲染仅支持BMP中的Unicode字符(换句话说:下面 U+10000)。只有支持简单的文本渲染(因此,就使用预先构成的表格而言,欧洲和一些东亚语言应该可以正常工作)。 [有一个 较小的精美印刷品 在这里为东亚和字符u+0000,u+0001,u+30fb。

实际考虑

  • 默认 在窗口上不是很有帮助。为了获得最佳体验,应该调整3件配置:

    • 输出:全面的控制台字体。为了获得最佳效果,我建议 我的构建. 。 (在此处存在安装说明,并在此页面上的其他答案中列出。)
    • 输入:功能强大的键盘布局。为了获得最佳效果,我建议 我的布局.
    • 输入: 允许Unicode的十六进制输入.
  • 另外一个将“粘贴”到控制台应用程序(非常技术性的)中:

    • 十六进制输入在 KeyUpAlt; 全部 交付角色的其他方法发生 KeyDown;如此多的应用程序还没有准备好看到字符 KeyUp. 。 (仅适用于应用 Console-I/O API。)
    • 结论:许多应用不会在十六进制事件上做出反应。
    • 此外,“粘贴”字符发生的事情取决于当前的键盘布局:如果可以不使用前缀键在不使用前缀键的情况 Ctrl-Alt-AltGr-Kana-Shift-Gray*)然后将其交付在模拟键盘上。这就是任何应用程序所期望的 - 因此,粘贴只包含此类字符的任何内容都可以。
    • 但是,“其他”字符由 模拟十六进制输入.

    结论: :除非您的键盘布局支持许多没有前缀密钥的字符的输入,否则 一些越野车应用程序 可能会跳过角色 Paste 通过Console的UI: Alt-Space E P. (这个 这就是为什么我建议使用键盘布局!)

还应该记住,Windows的“替代'更有能力的“控制台” 根本不是游戏机. 。他们不支持 Console-I/O API,因此依靠这些API工作的程序将无法正常工作。 (不过,仅使用“ file-i/o apis到控制台fileHandles”的程序可以正常工作。)

这种非辅音的一个例子是微软的一部分 Powershell. 。我不用这个;要进行实验,请按和释放 WinKey, ,然后输入 powershell.


(另一方面,有类似的程序 ConEmu 或者 ANSICON 尝试做更多的事情:他们“尝试”拦截 Console-I/O 使“真正的控制台应用程序”也起作用的API。这绝对适用于玩具示例程序;在现实生活中,这可能会或可能无法解决您的特定问题。实验。)

概括

  • 设置字体,键盘布局(并且可选,允许六角输入)。

  • 仅使用经过的程序 Console-I/O API,并接受Unicode命令行参数。例如,任何 cygwin- 策划程序应该很好。正如我已经说过的 CMD 也很好。

UPD: 最初,对于错误 cp65001, ,我正在混合内核和CRTL层(upd²: 和Windows用户模式API!)。 还: Win8修复了此错误的一半;我阐明了有关“更好的控制台”应用程序的部分,并添加了有关Python如何做到的参考。

其他提示

尝试:

chcp 65001

将将代码页面更改为UTF-8。另外,您需要使用Lucida Console字体。

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

对我有用的解决方案是:

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

我的批处理文件:

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

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

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

检查非单数程序的语言。如果您在Windows控制台中的俄罗斯人有问题,那么您应该在此处设置俄语:

Changing language for non-Unicode programs

更改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_CURRENT_USER" 经过 SET ROOT_KEY="HKEY_LOCAL_MACHINE"

实际上,诀窍是命令提示符实际上理解这些非英语字符,只是无法正确显示它们。

当我在命令提示符中输入一条路径,其中包含一些非英语Chracters,它显示为“ ???????????”。当您提交命令(CD“ ?????????????”时,一切都按预期工作。

在Windows 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字体,该字体支持您需要的字符,例如快递。我们通过将零添加到字符串名称中来做到这一点,因此在这种情况下,下一个将是“ 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

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

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

对于更永久的解决方案,请参阅 这个答案 在超级用户上。简而言之,创建一个 REG_SZ (字符串)使用Regedit AT的条目 HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor 并命名 AutoRun. 。将其价值更改为 chcp 65001. 。如果您不想从命令中查看输出消息,请使用 @chcp 65001>nul 反而。

一些程序在与此编码的交互时很难进行交互,MINGW是一个值得注意的一个,它在编译非敏感错误消息时失败了。尽管如此,这种情况非常有效,并且不会引起大多数程序的错误。

一个非常简单的选择是安装Windows Bash Shell,例如 明格 并使用它:

Enter image description here

有一点学习曲线,因为您需要使用UNIX命令行功能,但是您会喜欢它的功能,并且可以将控制台字符设置为UTF-8。

Enter image description here

当然,您还可以获得所有通常的 *nix好东西,例如grep,find,sight,s。

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

我这样解决了:

  1. 我将命令提示的字体更改为Lucida Console。 (此步骤必须与您的情况无关。它仅与您在屏幕上看到的内容有关,而不是与真正的角色有关)。

  2. 我将CodePage更改为Windows-1253。您可以通过“ CHCP 1253”的命令提示符执行此操作。它适用于我想查看UTF-8的情况。

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

打开此功能:“ Beta:使用Unicode UTF-8用于全球语言支持”

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

Region Settings

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

显示 文件名, , 如 dir 或者 ls 如果您在Windows 10上安装了Ubuntu Bash

  1. 将区域设置为支持非UTF 8字符。

  2. 之后,控制台的字体将更改为该语言环境的字体,并且还更改了控制台的编码。

完成前一步之后,为了显示 文件内容 使用命令行工具的UTF-8文件

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

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

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

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

这样,您创建一个.txt文件-Temp.txt。在记事本中打开它,复制文本(不用担心它看起来不可读),然后将其粘贴到.bat文件中。执行.bat在Dos-Window中创建了这种方式,为MRILLIC(保加利亚人)工作。

更好的清洁工作:只需安装可用的免费,Microsoft Japanese语言包即可。 (其他东方语言包也可以工作,但我已经测试了日语。)

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

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

在我的BCP语句 ^§中,我在CHCP 1252和CAP之前使用了CAP。

我在这里看到了几个答案,但是它们似乎并没有解决这个问题 - 用户希望从命令行获得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获取命令行WCHAR_T的Unicode版本 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,您不必更改编码。

看 ”引入Windows终端“ (从 凯拉肉桂)和 微软/终端.
通过使用Consolas字体, 部分的 将提供Unicode支持。

如有记录 Microsoft/Terminal 问题387:

Unicode目前有87,887个意识形态。您也需要所有这些吗?
我们需要一个边界,超出该边界的字符应通过字体后备 /字体链接 /其他任何内容来处理。

康索拉斯应该涵盖什么:

  • 用作现代OSS程序在CLI中使用的符号的字符。
  • 这些字符应遵循康索拉斯(Consolas)的设计和指标,并与现有的康索拉斯(Consolas)角色正确保持一致。

康斯拉斯不应该涵盖什么:

  • 拉丁语,希腊语和西里尔(Cyrillic)(尤其是角色)之外的字符和标点符号需要复杂的塑形(如阿拉伯语)。
  • 这些字符应使用字体后备处理。

我遇到了一个类似的问题,通过用简短的(8点3)名称在批处理文件中引用unicode命名的文件。

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

到UTF-8: chcp 65001

返回默认值: chcp 437

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top