2009-04-27 16 views
4

utf-8を受け入れるようにterminal.appを設定しました。また、bashでunicode文字を入力してコピー&ペーストすることもできますが、私はできないシェルと私はユニコードをデコードしようとする場合、私はエラーを取得:os x terminal.appのpythonでutf-8文字列をデコードできません

>>> wtf = u'\xe4\xf6\xfc'.decode() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-2: ordinal not in range(128) 
>>> wtf = u'\xe4\xf6\xfc'.decode('utf-8') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/encodings/utf_8.py", line 16, in decode 
    return codecs.utf_8_decode(input, errors, True) 
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-2: ordinal not in range(128) 

誰もが私が間違ってやっているか知っていますか?

+0

[この](http://stackoverflow.com/質問/ 368805/python-unicodedecodeerror-am-i-misunderstanding-encode/370199#370199)エンコード/デコードに関する関連する質問の回答が役に立つかもしれません。 – tzot

答えて

18

私はすべての場所の上にエンコード/デコードの混乱があると思います。あなたは、Unicodeオブジェクトで始まる:

u'\xe4\xf6\xfc' 

これはUnicodeオブジェクトで、3つの文字は「AOU」のUnicodeコードポイントです。あなたはUTF-8にそれらを有効にしたい場合は、エンコードそれらをする必要があります。

>>> u'\xe4\xf6\xfc'.encode('utf-8') 
'\xc3\xa4\xc3\xb6\xc3\xbc' 

結果の6つの文字が「AOU」のUTF-8表現したものです。

decode(...)を呼び出すと、文字をユニコードに変換する必要があるエンコードとして解釈しようとします。すでにUnicodeなので、これは動作しません。最初の呼び出しはAsciiからUnicodeへの変換を試み、2番目の呼び出しはUtf-8からUnicodeへの変換を呼び出します。 u'\xe4\xf6\xfc'は有効なAsciiでも有効なUtf-8でもないので、これらの変換の試行は失敗します。

さらに、混乱は、'\xe4\xf6\xfc'が "äöü"のLatin1/ISO-8859-1エンコードであるという事実から来るかもしれません。あなたは(ユニコードとしてそれをマークし、「U」を招くことなく)通常のPython文字列を記述する場合、あなたはdecode('latin1')でUnicodeオブジェクトに変換することができます

>>> '\xe4\xf6\xfc'.decode('latin1') 
u'\xe4\xf6\xfc' 
+1

aha。これは最終的に意味をなさない。 –

+0

合意。センスが作られました。 –

4

私はあなたが後方にエンコードしてデコードしていると思います。 Unicodeをバイトストリームにエンコードし、バイトストリームをUnicodeにデコードします。入門チュートリアルの

Python 2.6.1 (r261:67515, Dec 6 2008, 16:42:21) 
[GCC 4.0.1 (Apple Computer, Inc. build 5370)] on darwin 
Type "help", "copyright", "credits" or "license" for more information. 
>>> wtf = u'\xe4\xf6\xfc' 
>>> wtf 
u'\xe4\xf6\xfc' 
>>> print wtf 
äöü 
>>> wtf.encode('UTF-8') 
'\xc3\xa4\xc3\xb6\xc3\xbc' 
>>> print '\xc3\xa4\xc3\xb6\xc3\xbc'.decode('utf-8') 
äöü 
+1

郵便番号。 UTF-8はすでにエンコードされたバイトストリームなので、逆方向ではありませんが、少なくともそれは横向きになっています:) UTF-8の代わりにUnicodeを使用していた可能性があります。あなたの投稿を編集して決定させていただきます。 – tzot

+0

はい、そうです。ありがとう! –

2

Unicode stringsセクションがそれをうまく説明:

特定のエンコーディングを使用して8ビット列にUnicode文字列を変換するには、Unicodeオブジェクトは、かかるエンコード()メソッドを提供します1つの引数、エンコーディングの名前エンコーディングの小文字の名前が優先されます。

>>> u"äöü".encode('utf-8') 
'\xc3\xa4\xc3\xb6\xc3\xbc' 
+1

最後の行の文字をデコードしていませんか? –

+0

うん、私は疲れている間違ったことを取り除いた、ユニコードストリングのセクションは私よりもそれを説明する.. – dbr

3
>>> wtf = '\xe4\xf6\xfc' 
>>> wtf 
'\xe4\xf6\xfc' 
>>> print wtf 
��� 
>>> print wtf.decode("latin-1") 
äöü 
>>> wtf_unicode = unicode(wtf.decode("latin-1")) 
>>> wtf_unicode 
u'\xe4\xf6\xfc' 
>>> print wtf_unicode 
äöü 
関連する問題