2

Unicodeテキストファイル(UTF-8として保存)をクリーンアップするスクリプトを作成しています。3.xはデフォルトでUTF-に設定されているため、より一般的な2.xではなくPython 3.x(3.2)を使用することにしました。 8.8。何か間違ったことをしているのかもしれませんが、少なくともprintステートメントはまだデフォルトでUTF-8になっていないようです。特殊文字を含む文字列(以下のメッセージは文字列です)を印刷しようとすると、次のようなUnicodeEncodeErrorが発生します。

print(label, msg)
... in encode
    return codecs.charmap_encode(input,self.errors,encoding_map)[0] 
UnicodeEncodeError: 'charmap' codec can't encode character '\u0968' in position
38: character maps to <undefined>

最初にencode()メソッドを使用すると(デフォルトではUTF-8にうまく機能します)、エラーを回避できます。

print(label, msg.encode())

これは、ユニコード文字列を含むオブジェクトまたはリストを印刷する場合にも機能します。これは、str()がデフォルトでUTF-8に設定されているように見えるため、デバッグ時によく行う必要があります。しかし、print(myobj)を実行するたびに、print(str(myobj).encode())を使用することを本当に覚えておく必要がありますか?もしそうなら、私はそれを自分の関数でラップしようと試みることができると思いますが、print()がサポートするすべての引数の順列を処理することに自信がありません。

また、私のスクリプトはファイルから正規表現をロードし、それらを1つずつ適用します。encode()を適用する前に、私はコンソールにかなり読みやすいものを印刷することができました:

msg = 'Applying regex {} of {}: {}'.format(i, len(regexes), regex._findstr)
print(msg)

Applying regex 5 of 15: ^\\ge[0-9]*\b([ ]+[0-9]+\.)?[ ]*

ただし、正規表現にリテラルのUnicode文字が含まれているとクラッシュするため、最初に文字列にencode()を適用しました。しかし、現在、正規表現は画面上で非常に読みにくくなっています(そして、これらの正規表現をディスクに保存するコードを書き込もうとすると、同様の問題が発生する可能性があります)。

msg = 'Applying regex {} of {}: {}'.format(i, len(regexes), regex._findstr)
print(msg.encode())

b'Applying regex 5 of 15: ^\\\\ge[0-9]*\\b([ ]+[0-9]+\\.)?[ ]*'

私はまだPythonの経験が浅いので、誤解しているかもしれません。説明やチュートリアルへのリンク(Python 3.xの場合、オンラインで表示されるもののほとんどは2.xの場合)をいただければ幸いです。

4

2 に答える 2

6

printデフォルトではエンコードは使用されません。出力デバイス(コンソールなど)がサポートすると主張するエンコードを使用するだけです。コンソールエンコーディングは非ユニコードのように見えるためprint、そのエンコーディングでユニコード文字列をエンコードしようとして失敗します。これを回避する最も簡単な方法は、コンソールにutf8を使用するように指示することです(export LC_ALL=en_US.UTF-8UNIXシステムの場合と同様)。

于 2012-08-16T09:25:51.070 に答える
2

続行する簡単な方法は、スクリプトでUnicodeのみを使用し、「外部」の世界と対話する場合にのみエンコードされたデータを使用することです。つまり、デコードする入力またはエンコードする出力がある場合です。

これを行うには、何かを読むたびに、を使用しdecode、何かを出力するたびに、を使用しますencode

正規表現の場合は、re.UNICODEフラグを使用します。

これがあなたの質問に一点一点正確に答えるわけではないことを私は知っていますが、そのような方法論を適用することはあなたをエンコーディングの問題から安全に保つはずだと思います。

于 2012-08-16T09:09:37.620 に答える