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.
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
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