6

のような単純なファイル

$ cat x.py
x = u'Gen\xe8ve'
print x

実行すると、次のようになります。

$ python x.py
Genève

ただし、「コマンド置換」として実行すると、次のようになります。

$ echo $(python x.py)
...
UnicodeEncodeError: 'ascii' codec...

さまざまな端末エミュレーター (xterm、gnome-term) と ttyS のコンソールを試しました。bash と sh を使用します。python2.4 と 2.7 で。Pythonを実行する前に、LC_ALLまたはLANGをutf-8ロケールに設定しようとしました。sys.getdefaultencoding() を確認しました。そして、何も助けませんでした。

この問題は、スクリプトが別のプロセス (Java など) から呼び出された場合にも発生しますが、上記の方法が最も簡単に再現できる方法でした。

2 つの呼び出しの違いがわかりません。誰でも助けることができますか?

4

2 に答える 2

9

ここでの問題は、2 番目の呼び出しで、基本的にバイト文字列 (ファイルのようなオブジェクト) のみを受け入れるパイプに書き込んでいることです。これを実行しようとすると、同じことが起こります。

python x.py > my_file
Traceback (most recent call last):
File "x.py", line 2, in <module>
    print x
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe8' in position 3: ordinal not in range(128)

encode受信側はユニコード文字ではなくバイト文字列のみを理解するため、最初に次の関数を使用してユニコード文字列をバイト文字列にエンコードする必要があります。

x = u'Gen\xe8ve'.encode('utf-8') 
print x

これにより、utf-8 バイト文字列 (一連のバイト) としてエンコードされた Unicode 文字列が出力され、ファイルのようなオブジェクトに書き込むことができます。

$echo $(python x.py)
Genève
$python x.py 
Genève
于 2012-08-07T11:33:32.527 に答える
3

ご想像のとおり、標準出力が既知の端末でない場合、Python はユニコードを出力する方法を知りません。印刷する前に文字列をエンコードすることを検討してください。

# coding: utf-8
x = u'Gen\xe8ve'
print x.encode("utf-8")

呼び出しプログラムとスクリプトは、共通のエンコーディングで一致する必要があることに注意してください。

于 2012-08-07T11:31:32.133 に答える