2016-07-22 6 views
0

私は 'Ìাজ。py'という名前のpythonファイルを持っています。ファイルは何も空想的ではありません。私はそれを心配していません。事は「PY。কাজ」私はコピーして、ファイルを実行し、ファイル名を貼り付けしようとすると、それは表示されませんではなく、それはなぜPythonはWindowsコンソールでユニコード入力を受け付けないのですか?

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

いくつかの箱を示しており、それがこの

python: can't open file '???.py': [Errno 22] Invalid argument 
のようなエラーが発生します

が、私はgit add কাজ.pyを書いた場合、同じコンソール上に、それは

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

を示していますが、意外にもそれが動作し、任意のエラーを与えるものではありません。

私の質問は、どのようにgitがPythonができないのと同じコンソール上でUnicode入力を受け取ることができるのですか?私はWindowsプラットフォームでcmd.exeを使用しています。

答えて

2

コマンドが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にしか渡すことができません。

+0

これは私の問題を解決します。今私は問題がどこにあるのか正確に知っています。 Python3でうまくいけば、うまく動作します。私がpython2を使用したときに問題が発生しました。ありがとう – m3zbaul

+0

Python 2では 'ctypes'を使ってWin32の' GetCommandLineW' APIを直接呼び出すことができ、それを自分で解析しようとしますが、それはちょっと痛みです。 – bobince

関連する問題