2012-08-03 13 views
6

私は、次のPythonスクリプトがあります。それはなぜロケールの設定でこのUnicodeErrorが解決されないのですか?

export LC_ALL=en_US.utf8 
の作品、私は明示的にシェルでLC_ALL環境変数を設定すると、しかし

肥皂 
Traceback (most recent call last): 
    File "../pycli/samples/x.py", line 5, in <module> 
    print u'肥皂' 
UnicodeEncodeError: 'latin-1' codec can't encode characters in position 0-1: ordinal not in range(256) 

# -*- coding: utf-8 -*- 
import sys, locale 
locale.setlocale(locale.LC_ALL, 'en_US.utf8') 
print '肥皂' # This works 
print u'肥皂' 

は、私が手にスクリプトを実行します

私はなぜsetlocale()が同じ効果を持っていないのだろうかと思っていますか?

+0

「en_US.utf-8」で試しましたか? –

+0

うん、私はそれを試みたが、同じ結果で – trinth

+0

あなたはあなたの出力を.encode( 'utf-8')しようとしましたか? –

答えて

2

この値は、インタープリタの起動時に出力するデフォルトの文字セットを指定するためにのみ使用されます。言い換えれば、スクリプトが起動して実行していると、あなたは遅すぎます。

+0

その場合、その方法はなぜ存在するのですか?私の唯一の選択肢は、環境変数を手動で設定するようなものです。 – trinth

1

ユニコードは、プログラム内にのみ存在するテキストの概念的アイデアと似ています。

すべての文字をサポートできるという利点がありますが、そのまま出力することができないため、表示可能なエンコードにエンコードする必要があるという欠点があります。

入力が必要な場合はエンコードされ、デコードする必要があります。ユニコードを出力する場合はエンコードする必要があります。

もしあなたがしなければ、pythonはあなたのためにそれをしようとします(あなたの場合のように、あなたのenvで見つけられるかもしれません)。しかし、pythonが間違っているかもしれないので、これに頼るべきではありません(あなたの場合のように)。

あなたのケースでは、あなたの端末がutf8をサポートしていますが、pythonはutf8を使用している可能性があることに気付くでしょう。

ザッツなぜあなたは常にエンコード出力すべきと入力をデコードする(可能な場合、好ましくは、UTF8を使用して!)

あなたはUnicodeのエンコード方法とそれらを引数としてエンコーディングを与える文字列のデコード方法を使用して、これを達成することができます。

関連する問題