コマンドがUNICODEまたはMBCSコマンドラインアプリケーションインターフェイスを内部的に使用するかどうかによって異なります。それがC(またはC++)プログラムであると仮定すると、main
またはwmain
を使用するかどうかによって異なります。ユニコードインターフェイスを使用している場合は、実際のユニコード文字が表示されます(表示されずに?
と表示された場合でも)、正しいファイルが開きます。しかし、いわゆるMBCSインターフェースを使用すると、255を超えるコードを持つ文字は、?
(文字コード0x63)で変換され、間違ったファイルを開こうとします。
動作の違いは、Pythonバージョン(私は2.xと仮定します)がそうでないうちに、gitの実装がUnicode互換であることを単純に証明しています。テストされていませんが、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モードでldを実行します(ユニコードの場合はকাজ
はそれぞれU + 0995、U + 09BE、U + 099Cの3文字)
コマンドライン引数を処理するCランタイムコードで情報が失われるため、それを回復するために行われます。したがって、スクリプトにユニコード名を使用できるようにしたい場合は、Python3にしか渡すことができません。
これは私の問題を解決します。今私は問題がどこにあるのか正確に知っています。 Python3でうまくいけば、うまく動作します。私がpython2を使用したときに問題が発生しました。ありがとう – m3zbaul
Python 2では 'ctypes'を使ってWin32の' GetCommandLineW' APIを直接呼び出すことができ、それを自分で解析しようとしますが、それはちょっと痛みです。 – bobince