2017-01-06 6 views
1

私は最近、エンコーディングに関係する何かを勉強していると私は、次のについて混乱しています:私は非ASCII文字をPythonビルトイン文字列に割り当てるとき、値はどういう意味ですか?

a = "哈" ## whatever non-ascii char is fine 
a[0] ## = "\xe5" 
a[1] ## = "\x93" 
a[2] ## = "\x88" 

len(a)は3になります持っているかどうかを確認し

、および値のそれぞれは、「\のxe5」になり、

a.decode("utf-8") ## = u"\u54c8" 

それは、Unicode文字列、および第なります:私は私がしなければということを理解する "の\ X93"、および "の\ X88"

eコードポイントは "\ u54c8"となります。 質問は:どのようなエンコード方法は、組み込みのPythonの文字列を使用していますか? a [0]は「\ x54」でなく、「1」は「\ xc8」でないので、一緒に「54c8」になるのはなぜですか?

右のutf-8コードポイントが "\ u54c8"である必要があるため、組み込みのpython strのエンコーディングはutf-8であってはなりません。そうですか?

+0

使用しているPythonのバージョンは何ですか? – rdegges

+0

sry私はそれを明確にしませんでした。これはPython 2.7.12です。 @rdegges – Nemo

+0

utf8の詳細については、手動でデコードするコードも含めて、http://stackoverflow.com/a/38653062/4014959を参照してください。 –

答えて

1

UTF-8とUnicodeは同じものではありません。 Unicodeは整数値の文字への抽象マッピングです。 UTF-8はです。これらの整数をバイト列として表す特別な方法です。 \xe5\x93\x88は、1バイトで表現できない整数0x54c8の3バイトUTF-8エンコーディングです。

Pythonの2のデフォルトのエンコードはISO-8859だったが、そのようにインタプリタに非ASCII文字を貼り付けた結果があなたの端末のエンコーディングに依存している

1

のPython 3にUTF-8に変更しました。あなたの端末ではutf-8エンコーディングの可能性があります(データを見ることから)。

a = "哈" 

あなたはPythonで2対話インタプリタをコード行を評価するとき、あなたははすでにをコード化していることをバイト文字列オブジェクトを作成します。

それから、テキストオブジェクトを取得するには、あなたが使用してデータをデコードする必要があります:

a.decode(encoding) 

それは常にテキストとしてバイトunicodeオブジェクトとしてstrオブジェクトを考えるのに役立ちます。

コードポイントとutf-8でエンコードされたバイトの間に単純な関係はありません。 シンプルであることを関係は、あなたがそのインデックスにある文字を検索するために使用する大きなテーブルでちょうど指標として、コードポイントの

u'哈' == u'\u54c8' == unichr(21704) 

が考えることです。上記の等式は、哈がコードポイント21704の文字であることを示しています(16進数のため、0x54c8は21704です)。

コードポイント(21704)とUTFバイト(\ xe5と\ x93のもの)の関係を知りたい場合は、すでにhereという長い答えを書いています。あなたが手でUTFをエンコード/デコードする方法を学ぶことに興味があるなら、それを読むことができます。

関連する問題