6

次の Python スクリプトがあります。

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

スクリプトを実行すると、次のようになります。

肥皂
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)

ただし、シェルで LC_ALL 環境変数を明示的に設定すると、機能します

export LC_ALL=en_US.utf8

では、なぜ setlocale() が同じ効果を持たないのだろうか?

4

2 に答える 2

2

この値は、インタープリターの起動時に出力するデフォルトの文字セットを指定するためにのみ使用されます。つまり、スクリプトが起動して実行されてからでは手遅れです。

于 2012-08-03T17:37:16.177 に答える
1

Unicodeは、プログラム内にのみ存在するテキストの概念的な考え方のようなものです。

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

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

あなたがそれをしない場合、Pythonはあなたのためにそれを試みます(ASCII、またはあなたの場合のようにあなたの環境で見つかるかもしれないものを使用して)、しかしあなたはこれに頼るべきではありません、なぜならPythonはそれを間違っているかもしれないからです(あなたのように場合)。

おかしなことに、あなたの場合、端末はutf8をサポートしていますが、Pythonはutf8を使用している可能性があることを認識していませんでした。

そのため、常に出力をエンコードして入力をデコードする必要があります(可能な場合はutf8を使用することをお勧めします)。

これは、Unicodeエンコードメソッドと文字列デコードメソッドを使用して実現でき、引数としてエンコードを指定します。

于 2012-08-03T18:21:23.067 に答える