2016-07-22 2 views
0

Ich habe eine Python-Datei namens 'কাজ. Py'. Die Datei macht nichts Besonderes. Ich bin nicht besorgt darüber. Die Sache ist, wenn ich versuche, die Datei auszuführen, indem das Kopieren und den Dateinamen einfügen, es zeigt nicht ‚কাজ. Py‘ eher zeigt es ein paar KistenWarum kann Python keine Unicode-Eingaben an der Windows-Konsole vornehmen?

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

und es löst einen Fehler wie diese

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

aber auf der gleichen Konsole, wenn ich git add কাজ.py schreiben, zeigt es

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

aber überraschenderweise funktioniert es und geben keinen Fehler.

Meine Frage ist, wie kommt git kann Unicode-Eingabe auf der gleichen Konsole, wo Python nicht? Bitte beachten Sie, dass ich auf Windows-Plattform bin und cmd.exe

Antwort

2

verwenden. Es hängt davon ab, ob der Befehl intern die UNICODE oder MBCS-Befehlszeilenanwendungsschnittstelle verwendet. Angenommen, es ist ein C (oder C++) Programm, hängt es ab, ob es eine main oder wmain verwendet. Wenn es eine Unicode-Schnittstelle verwendet, erhält es die wahren Unicode-Zeichen (auch wenn es nicht angezeigt werden kann und nur ? anzeigt) und als solches wird die richtige Datei geöffnet. Aber wenn es die so genannte MBCS-Schnittstelle verwendet, werden Zeichen mit einem Code über 255 in true ? (Zeichencode 0x63) übersetzt und es wird versucht, eine falsche Datei zu öffnen.

Der Unterschied des Verhaltens beweist einfach, dass Ihre Git-Implementierung Unicode-kompatibel ist, während Sie Python-Version (ich nehme 2.x) nicht ist. Nicht getestet, aber ich denke, dass Python 3 unter Windows Unicode-kompatibel ist.

Hier ist ein kleines C-Programm, das, was passiert, zeigt:

#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; 
} 

Wenn Sie es (durch Einfügen der কাজ Zeichen in der Konsole) als cmdline কাজ) sehen Sie rufen:

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

wenn eingebaut im MBCS-Modus und

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

wenn bui ld im UNICODE-Modus (die 3 Zeichen কাজ sind jeweils U + 0995, U + 09BE und U + 099C im Unicode)

Da die Informationen im C-Laufzeitcode verloren gehen, der die Befehlszeilenargumente verarbeitet, kann nichts passieren getan, um es wiederherzustellen. Sie können also nur an Python3 übergeben, wenn Sie Unicode-Namen für Ihre Skripte verwenden möchten.

+0

das löst mein Problem. Jetzt weiß ich genau, wo das Problem ist. und ja, mit Python3 funktioniert es ganz gut. Problem trat auf, als ich Python2 benutzte. Danke – m3zbaul

+0

In Python 2 können Sie immer noch 'ctypes' verwenden, um das Win32' GetCommandLineW' API direkt aufzurufen und es selbst zu analysieren, aber es ist ein bisschen mühsam. – bobince

Verwandte Themen