它取決於該命令是否在內部使用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。
這解決了我的問題。現在我確切知道問題出在哪裏。是的,與python3,它工作得很好。當我使用python2時發生問題。謝謝 – m3zbaul
在Python 2上,仍然可以使用'ctypes'直接調用Win32'GetCommandLineW' API並嘗試自己解析它,但這有點痛苦。 – bobince