2016-07-12 7 views
0

私はpython2からpython3にいくつかのコードを変換しています。私も、私はpython2でpython2のstring.decode()関数

のpython3でやるべきかを決定するのに十分なpython2エンコード/デコード機能を理解していない、私は次のことを行うことができます。

私はちょうどそこに何をしました
>>> c = '\xe5\xb8\x90\xe6\x88\xb7' 
>>> print c 
帐户 
>>> c.decode('utf8') 
u'\u5e10\u6237' 

? 'u'接頭辞はユニコードを意味しないのですか? utf8は '\ xe5 \ xb8 \ x90 \ xe6 \ x88 \ xb7'でなくてはなりません。

答えて

1

変数cはユニコード(接頭辞「u」)として宣言されていません。 decodeの結果はUnicode文字列であることを

>>> c.decode('latin1') 
u'\xe5\xb8\x90\xe6\x88\xb7' 

注:あなたはそれはあなたが同じ結果を取得しますエンコード「latin1の」を使用してデコードする場合は、UnicodeとしてCを宣言すると

>>> type(c) 
<type 'str'> 
>>> type(c.decode('latin1')) 
<type 'unicode'> 

をし、同じ入力を続けるには、同じ文字を印刷しません。

>>> c=u'\xe5\xb8\x90\xe6\x88\xb7' 
>>> print c 
å¸æ· 

あなたが入力「\ u5e10 \ u6237」を使用する場合は、最初の文字がプリントされます:

>>> c=u'\u5e10\u6237' 
>>> print c 
帐户 

エンコーディングとデコーディングは、対応値< - >文字の表を使用するだけです。同じ値が、使用されるエンコーディング(つまりテーブル)に従って同じ文字をレンダリングしないことです。

主な難点は、処理する必要がある入力文字列のエンコーディングがわからない場合です。いくつかのツールはそれを推測することができますが、必ずしも成功するとは限りません(https://superuser.com/questions/301552/how-to-auto-detect-text-file-encoding参照)。

+0

*エンコードとデコードは、対応値のテーブル<->文字*を使用することの問題です。*私は好きです*エンコードとデコードは、対応表(1バイト)の文字を使用することの単なるものです<->ユニコード文字* –

+0

@SergeBallestaはいそうです。私はバイト値として '値'を意味しました。 – Frodon

+0

u '\ u5e10 \ u6237'はどのような形式ですか?それは実際にutf8ですか?次に、latin1の '\ xe5 \ xb8 \ x90 \ xe6 \ x88 \ xb7'の形式は?これは混乱しています。なぜなら、これらの中国語文字をpython3のバイトに変換すると、私が想定していた '\ xe5 \ xb8 \ x90 \ xe6 \ x88 \ xb7'というutf8が得られます。 – kingledion