2012-04-23 28 views
8
>>> a = "我" # chinese 
>>> b = unicode(a,"gb2312") 
>>> a.__class__ 
<type 'str'> 
>>> b.__class__ 
<type 'unicode'> # b is unicode 
>>> a 
'\xce\xd2' 
>>> b 
u'\u6211' 

>>> c = u"我" 
>>> c.__class__ 
<type 'unicode'> # c is unicode 
>>> c 
u'\xce\xd2' 

bcはすべてのUnicodeであるが、>>> b出力u'\u6211'、及び>>> c出力u'\xce\xd2'、なぜですか?Unicodeと `デコード()` Pythonで

+0

あなたはどの端末を使用していますか?私はUnicode gnome-terminal( 'c === u '\ u6211'')で結果を再現できません。 –

+0

@ChrisMorganこれらのコードをIDLEでテストします。 –

+0

はIDLEでこれを再現することもできます –

答えて

12

"我"と入力すると、Pythonインタプリタはローカル文字セット内のその文字の表記を端末から取得します。これは、""のために1バイトの文字列で格納されます。私のUTF-8システムでは、それはです。 GB2312を使用しているため、あなたには'\xce\xd2'です。変数aの値が説明されています。

u"我"と入力すると、Pythonインタプリタは、文字が入っているエンコードを認識しません。通常の文字列とほとんど同じです。文字のバイトをUnicode文字列に格納し、各バイトをUnicodeコードポイントとして解釈するので、間違った結果u'\xce\xd2'(または、私のボックスでは、u'\xe6\x88\x91')です。

この問題は、インタラクティブなインタプリタにのみ存在します。 Pythonのスクリプトやモジュールを書くと、上部にはspecify the encodingがあり、Unicode文字列が正しく出てきます。

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 

print(u"liberté") 
print("liberté") 
0

Pythonの対話ショーあなただけのタイプ-にその名前のオブジェクトの表現:例えば、私のシステム上で、次の単語を2回リベルテを印刷します。一方、printコマンドは文字をレンダリングしようとします。変数という名前の変数は文字列型です。実際、Python 2.xの文字列は一連のバイトです。したがって、あなたの作業環境によって異なります。 unicode()関数には、gb2312エンコーディングを使用しています。 trueの場合、bには、指定されたエンコーディングの文字の正しい表現が含まれます。

は、あなたのケースで

>>> print b 

してみてください。欲しい結果が表示される可能性があります。また、試してみてください:

>>> print repr(a) 
... 
>>> print repr(b) 

表現は(可能ならば)コピー&ペーストソースコードには、同じ値を持つオブジェクトを作成することをテキスト文字列です。

Mark Pilgrimの「Python 3への潜入」の第4章の文字列(http://getpython3.com/diveintopython3/strings.html)を読んでみましょう。

関連する問題