为什么python不能在Windows控制台上获取unicode输入?

时间:2016-07-22 08:35:07

标签: python git unicode

我有一个名为'কাজ.py'的python文件。该文件没有任何花哨的东西。我并不担心。问题是当我尝试通过复制和粘贴文件名来运行文件时,它没有显示'কাজ。py'而是它显示了一些框

> python [?][?][?].py

它会引发像这样的错误

python: can't open file '???.py': [Errno 22] Invalid argument

但在同一个控制台上,如果我写git add কাজ.py,则会显示

> git add [?][?][?].py

但令人惊讶的是它起作用并且没有任何错误。

我的问题是git如何在同一个python不能的控制台上输入unicode?请注意我在Windows平台上并使用cmd.exe

1 个答案:

答案 0 :(得分:2)

这取决于命令是否在内部使用UNICODE或MBCS命令行应用程序接口。假设它是一个C(或C ++)程序,它取决于它是使用main还是wmain。如果它使用unicode接口,它将获得真正的unicode字符(即使它不能显示它们并且只显示?),因此将打开正确的文件。但如果它使用所谓的MBCS接口,代码大于255的字符将被转换为真?(字符代码0x63),并且它将尝试打开错误的文件。

行为的差异只是证明你的git实现是unicode兼容的,而你的Python版本(我假设2.x)则不是。未经测试,但我认为Python 3在Windows上本身是Unicode兼容的。

这是一个小型C程序,演示了会发生什么:

#include <stdio.h>
#include <windows.h>
#include <tchar.h>

int _tmain(int argc, LPTSTR argv[]) {
    int i;

    _tprintf(_T("Arguments"));
    for(i=0; i<argc; i++) {
        _tprintf(_T(" >%s<"), argv[i]);
    }
    _tprintf(_T("\n"));

    if (argc > 1) {
        LPCTSTR ix = argv[1];
        _tprintf(_T("Dump param 1 :"));
        while (*ix != 0) {
            _tprintf(_T(" %c(%x)"), *ix, ((unsigned int) *ix) & 0xffff);
            ix += 1;
        }
        _tprintf(_T("\n"));
    }
    return 0;
}

如果您将其称为(通过将控制台中的কাজ字符粘贴为cmdline কাজ),您会看到:

...>cmdline ab???cd
Arguments >cmdline< >ab???cd<
Dump param 1 : a(61) b(62) ?(3f) ?(3f) ?(3f) c(63) d(64)

以MBCS模式构建并

...>cmdline ab???cd
Arguments >cmdline< >ab???cd<
Dump param 1 : a(61) b(62) ?(995) ?(9be) ?(99c) c(63) d(64)

在UNICODE模式下构建时(3个字符কাজ分别是U + 0995,U + 09BE和U + 099C在unicode中)

由于信息在处理命令行参数的C运行时代码中丢失,因此无法执行任何操作来恢复它。因此,如果您希望能够为脚本使用unicode名称,则只能传递给Python3。