2016-07-22 22 views
0

我有一個名爲'কাজ。py'的python文件。該文件沒有任何幻想。我並不擔心這一點。事情是,當我試圖複製並粘貼文件名,它不顯示運行該文件「কাজ。PY」,而它顯示了一些箱子爲什麼python不能在Windows控制檯上使用unicode輸入?

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

和它提出了這樣的

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

,但在同一個控制檯上,如果我寫git add কাজ.py,它顯示

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

但意外的是工作,不給任何錯誤。

我的問題是怎麼git可以採取unicode輸入在python不能在同一個控制檯?請注意,我在Windows平臺上並使用cmd.exe

回答

2

它取決於該命令是否在內部使用UNICODE或MBCS命令行應用程序接口。假設它是C(或C++)程序,取決於它是使用main還是wmain。如果它使用unicode接口,它將得到真正的unicode字符(即使它不能顯示它們,並且只顯示?),因此會打開正確的文件。但是,如果它使用所謂的MBCS接口,則代碼大於255的字符將被翻譯爲真(字符代碼0x63),並且它將嘗試打開錯誤的文件。

行爲的差異只是證明你的git實現是unicode兼容的,而你的Python版本(我假設2.x)不是。未經測試,但我認爲Python 3在本機上與Windows兼容。

這裏是一個小的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) 

當bui ld在UNICODE模式下(3個字符কাজ分別是U + 0995,U + 09BE和U + 099C在unicode中)

由於信息在處理命令行參數的C運行時代碼中丟失,完成恢復它。所以如果你想能夠爲你的腳本使用unicode名字,你只能傳遞給Python3。

+0

這解決了我的問題。現在我確切知道問題出在哪裏。是的,與python3,它工作得很好。當我使用python2時發生問題。謝謝 – m3zbaul

+0

在Python 2上,仍然可以使用'ctypes'直接調用Win32'GetCommandLineW' API並嘗試自己解析它,但這有點痛苦。 – bobince

相關問題