2017-03-14 14 views
3

私はこのような複数の六角値を必要とする文字で文字列を変換しようとしていますに\ xHH六角値を持つ文字列:Pythonの3 - Unicodeの

'Mahou Shoujo Madoka\xe2\x98\x85Magica' 

そのUnicode表現へ:

'Mahou Shoujo Madoka★Magica' 

文字列を出力すると、各16進値を別々に評価しようとします。したがって、デフォルトではこれは次のようになります。

x = 'Mahou Shoujo Madoka\xe2\x98\x85Magica' 
print(x) 

Mahou Shoujo MadokaâMagica 

z = 'Mahou Shoujo Madoka\xe2\x98\x85Magica' 
x = binascii.unhexlify(binascii.hexlify(z.encode('utf-8'))).decode('utf-8') 
print('x:', x) 

x: Mahou Shoujo MadokaâMagica 

そしていくつかの他、それらのどれも働いた:

x = 'Mahou Shoujo Madoka\xe2\x98\x85Magica' 
z = x.encode('utf-8') 
print('z:', z) 
y = z.decode('utf-8') 
print('y:', y) 

z: b'Mahou Shoujo Madoka\xc3\xa2\xc2\x98\xc2\x85Magica' 
y: Mahou Shoujo MadokaâMagica 

Python: Convert Unicode-Hex-String to Unicode:などBest way to convert string to bytes in Python 3?など、いくつかの他のStackOverflowの答えを、試してみました。私が見つけた結果のほとんどはdouble backslash problemの人でしたが、私の正確な問題はなかった。

str.encodeを実行すると、最初の試みでzとxの違いなどのバイナリに余分な値が追加されているように見えます。

だから私は、手動でバイナリに文字列の文字を入力しようとした:

x = b'Mahou Shoujo Madoka\xe2\x98\x85Magica' 
x.decode('utf-8') 

'Mahou Shoujo Madoka★Magica' 

、それが働きました。しかし、文字列からバイナリに変換する方法を見つけることができませんでした。どこが間違っていますか?

答えて

3

Python 3では、元の文字列はUnicode文字列ですが、UTF-8のように見えるUnicodeコードポイントが含まれていますが、正しくデコードされません。それを修正する:

>>> s = 'Mahou Shoujo Madoka\xe2\x98\x85Magica' 
>>> type(s) 
<class 'str'> 
>>> s.encode('latin1') 
b'Mahou Shoujo Madoka\xe2\x98\x85Magica' 
>>> s.encode('latin1').decode('utf8') 
'Mahou Shoujo Madoka★Magica' 

latin1符号化は1マッピングする起こる:Unicodeで最初の256個のコード・ポイントに1を、そう.encode('latin1')直接バックバイトのコードポイントを変換します。次に、適切にバイトを.decode('utf8')することができます。

+0

文字列を変数に代入するには、上記を 's = b" \ xe2 \ x98 \ x85 ".decode(" utf8 ")'に短縮することができます。 – Jens

+0

@Jensあなたはそれを 's = '★''に短縮することができましたが、それは質問のポイントではありませんでした。 –