¿Por qué Python no puede tomar inputs Unicode en la console de Windows?

Tengo un file de Python llamado 'কাজ. Py'. El file no tiene nada de lujoso. No estoy preocupado por eso. El caso es que cuando bash ejecutar el file copyndo y pegando el nombre del file, no se muestra 'py. Py' sino que muestra algunos cuadros

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

y plantea un error como este

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

pero en la misma console, si escribo git add কাজ.py , se muestra

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

pero sorprendentemente funciona y no da ningún error.

Mi pregunta es ¿cómo puede venir git a la input de Unicode en la misma console donde Python no puede? Tenga en count que estoy en la plataforma de Windows y uso cmd.exe

Depende si el command utiliza internamente la interfaz de la aplicación de command-line UNICODE o MBCS. Suponiendo que es un progtwig C (o C ++), depende de si usa un main o wmain . Si utiliza una interfaz Unicode, obtendrá los caracteres Unicode verdaderos (incluso si no puede mostrarlos y solo muestra ? ) Y como tal abrirá el file correcto. Pero si utiliza la llamada interfaz MBCS, los caracteres con un código superior a 255 se traducirán en verdadero ? (código de carácter 0x63) e intentará abrir un file incorrecto.

La diferencia de comportamiento simplemente demuestra que su implementación de git es compatible con Unicode mientras que la versión de Python (supongo 2.x) no lo es. No probado, pero creo que Python 3 es compatible nativamente con Unicode en Windows.

Aquí hay un pequeño progtwig de C que demuestra lo que sucede:

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

Si lo llamas (pegando los কাজ caracteres en la console) como cmdline কাজ ) ves:

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

cuando se construye en modo MBCS y

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

cuando se construye en modo UNICODE (los 3 caracteres কাজ son respectivamente U + 0995, U + 09BE y U + 099C en Unicode)

Como la información se pierde en el código de time de ejecución de C que procesa los arguments de la command-line, no se puede hacer nada para recuperarla. Por lo tanto, solo puede pasar a Python3 si desea poder utilizar nombres unicode para sus scripts.