我有一个名为'কাজ.py'的python文件。该文件没有任何花哨的东西。我并不担心。问题是当我尝试通过复制和粘贴文件名来运行文件时,它没有显示'কাজ。py'而是它显示了一些框
> python [?][?][?].py
它会引发像这样的错误
python: can't open file '???.py': [Errno 22] Invalid argument
但在同一个控制台上,如果我写git add কাজ.py
,则会显示
> git add [?][?][?].py
但令人惊讶的是它起作用并且没有任何错误。
我的问题是git如何在同一个python不能的控制台上输入unicode?请注意我在Windows平台上并使用cmd.exe
答案 0 :(得分:2)
这取决于命令是否在内部使用UNICODE或MBCS命令行应用程序接口。假设它是一个C(或C ++)程序,它取决于它是使用main
还是wmain
。如果它使用unicode接口,它将获得真正的unicode字符(即使它不能显示它们并且只显示?
),因此将打开正确的文件。但如果它使用所谓的MBCS接口,代码大于255的字符将被转换为真?
(字符代码0x63),并且它将尝试打开错误的文件。
行为的差异只是证明你的git实现是unicode兼容的,而你的Python版本(我假设2.x)则不是。未经测试,但我认为Python 3在Windows上本身是Unicode兼容的。
这是一个小型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)
在UNICODE模式下构建时(3个字符কাজ
分别是U + 0995,U + 09BE和U + 099C在unicode中)
由于信息在处理命令行参数的C运行时代码中丢失,因此无法执行任何操作来恢复它。因此,如果您希望能够为脚本使用unicode名称,则只能传递给Python3。