19

しばらくの間、使用できないと仮定しますprint(したがって、自動エンコーディング検出の利点を享受できます)。だからそれは私たちにを残しsys.stdoutます。ただし、賢明なエンコーディングを行わないsys.stdoutほど馬鹿げています。

ここで、Python wikiページのPrintFailsを読み、次のコードを試してみます。

$ python -c 'import sys, codecs, locale; print str(sys.stdout.encoding); \
  sys.stdout = codecs.getwriter(locale.getpreferredencoding())(sys.stdout);

ただし、これも機能しません(少なくともMacでは)。理由がわかりすぎます:

>>> import locale
>>> locale.getpreferredencoding()
'mac-roman'
>>> sys.stdout.encoding
'UTF-8'

(UTF-8は端末が理解できるものです)。

したがって、上記のコードを次のように変更します。

$ python -c 'import sys, codecs, locale; print str(sys.stdout.encoding); \
  sys.stdout = codecs.getwriter(sys.stdout.encoding)(sys.stdout);

これで、Unicode文字列が適切に送信さsys.stdoutれ、端末に適切に印刷されます(端末sys.stdoutに接続されています)。

これはUnicode文字列を書き込む正しい方法ですか、sys.stdoutそれとも他のことをする必要がありますか?

編集:時々-たとえば、出力をless-にパイプするとき-sys.stdout.encodingになりますNone。この場合、上記のコードは失敗します。

4

5 に答える 5

34
export PYTHONIOENCODING=utf-8

仕事をしますが、Python自体に設定することはできません...

私たちにできることは、が設定されていないかどうかを確認し、スクリプトを呼び出す前に設定するようにユーザーに指示することです。

if __name__ == '__main__':
    if (sys.stdout.encoding is None):
        print >> sys.stderr, "please set python env PYTHONIOENCODING=UTF-8, example: export PYTHONIOENCODING=UTF-8, when write to stdout."
        exit(1)
于 2011-06-15T17:04:06.067 に答える
10

端末に直接接続されているかどうかを確認することをお勧めします。使用している場合は、端末のエンコーディングを使用してください。それ以外の場合は、システム優先エンコーディングを使用してください。

if sys.stdout.isatty():
    default_encoding = sys.stdout.encoding
else:
    default_encoding = locale.getpreferredencoding()

また、ユーザーが必要なエンコーディングを常に指定できるようにすることも非常に重要です。通常、私はそれをコマンドラインオプション(のような-e ENCODING)にし、モジュールで解析しoptparseます。

もう1つの良い点は、自動エンコーダーで上書きしないことです。sys.stdoutエンコーダーを作成して使用しますが、そのままにしておきsys.stdoutます。エンコードされたバイト文字列をに直接書き込むサードパーティのライブラリをインポートできますsys.stdout

于 2009-09-25T02:55:36.240 に答える
9

オプションの環境変数「PYTHONIOENCODING」があり、これを目的のデフォルトのエンコーディングに設定できます。これは、すべてのPythonと一貫性のある方法で、ユーザーが希望するエンコーディングを取得する1つの方法です。ここのPythonマニュアルに埋め込まれています。

于 2010-10-26T20:50:59.943 に答える
7

これは私が私のアプリケーションで行っていることです:

sys.stdout.write(s.encode('utf-8'))

これは、argvからUTF-8名を読み取るための正反対の修正です。

for file in sys.argv[1:]:
    file = file.decode('utf-8')

これは非常に醜い(IMHO)ので、UTF-8を使用する必要があります。これは、Linux / Macでは標準ですが、Windowsでは標準ではありません...とにかく私には機能します:)

于 2012-12-04T12:36:40.087 に答える
3

なぜあなたが印刷できないのかは私にはわかりません。しかし、そうだとすれば、そうです、アプローチは私には正しいように見えます。

于 2009-09-24T19:40:07.830 に答える