2

私は次のコードを実行しています:

def displayFileOld(file_path):
    f = open(file_path, mode = 'rt', encoding = 'cp1252', errors = 'replace')  
    while True:
        line = f.readline()
        if len(line) == 0:
            break
        print(line)

Python 3.3、Windows8Proでは。

私が「解析」しているファイル(Javaソースファイル)は、Cp1252(「メインコンテナから継承」)でエンコードされているものとしてEclipseによって表示されます。Notepad ++は、「ANSI」以外の何もエンコードメニューの下に表示しません。これらの2つは一致します。

まず第一に、Unicodeへのエンコーディングが機能することを期待します。ただし、次のメッセージで失敗します。

Traceback (most recent call last):
  File "C:\work\test.py", line 69, in <module>
    main()
  File "C:\work\test.py", line 65, in main
    displayFileOld(r'C:\work\CVSProvisioningFeatures.java')
  File "C:\work\test.py", line 48, in displayFileOld
    print(line)
  File "C:\Python33\lib\encodings\cp437.py", line 19, in encode
    return codecs.charmap_encode(input,self.errors,encoding_map)[0]
UnicodeEncodeError: 'charmap' codec can't encode characters in position 62-63:     character maps to <undefined>

次に、フラグで言及したエンコーディングに対応する* .pyファイルの代わりに、スタックトレースでcp437.pyが言及されることは期待していません。(「†」文字が検出されると解析は失敗します。Unicodeにこれがどのように含まれないかはわかりません。これはコンテキストです:'new FeatureDescription(i ++、"††" + str));')。

第三に、エラーフラグが完全に無視される理由がわかりません。

私は、一般的な「ANSI」傘下でホストされているさまざまなエンコーディングを試すのに数時間を費やしましたが、無駄でした。私にできることは、例外をキャッチしてその行を無視することだけです(受け入れられません)。別のアプローチは、MacRomanなどの「エキゾチック」なエンコーディングを使用することですが、ソースツリー全体を調べた後でも予期しない文字が残ります(431ではなく12のエラーしか発生しませんが)...最終的に必要になる文字作業を転送し、大量の文字列を渡します。スクリプトの使用に取り組むJavaソースは約50MBあるので、この設定に協力していただければ幸いです。

4

1 に答える 1

2

問題はファイルの読み取りではなく、印刷です。トレースバックは、行が前にあることを示していprint(line)ますUnicodeEncodeError(その例外のエンコードに注意してください)。ファイルを読み取ると、cp1252 からオブジェクトにデコードされますが、これは問題なく機能しています。unicode

Windows 端末はコードページ 437 を使用しており、印刷しようとしている文字を処理できません。Python は、データを Unicode から端末が使用しているものに変換して、文字を表示できるようにする必要があります。

コマンドを使用して端末のコードページを切り替えることができますchcp 65001(Python 式ではなく、Windows コマンドライン ツール)。コードページ 65001 は、すべての Unicode コード ポイントを処理できる UTF-8 コードページです。これらの文字も表示できるようにするには、フォントを切り替える必要がある場合があります。Windows コマンド ラインで Unicode 文字を参照してください - どのように?

于 2013-01-22T18:29:25.070 に答える