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

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


当前回答

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

其他回答

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

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

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

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

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

Try:

chcp 65001

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

在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字体,支持你需要的字符,如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

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

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

1)微软有一个扩展,允许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://learn.microsoft.com/en-us/windows/desktop/api/shellapi/nf-shellapi-commandlinetoargvw

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