2016-12-09 9 views
0

文字列のエンコーディングとフォーマットは常に私を投げます。ここで文字列エンコーディングIDNA - > UTF-8(Python)

は、私が持っているものです。

'ไทย' 私はUTF-8であると考えてい

、および

'XN - o3cw4h' で同じものである必要があり

IDNAエンコード。しかし、私はどのようにPythonを互いに変換するのかを理解することはできません。 ( - もはやユニコードものの、 'o3cw4h XNを')

私はちょうど

a = u'xn--o3cw4h' 
b = a.encode('idna') 
b.decode('utf-8') 

をしようとしていたが、私は戻って、まったく同じ文字列を取得します。私は現在Python 3.5を使用しています。

+0

Python2またはPython3を使用していますか? –

+0

http://nedbatchelder.com/text/unipain.htmlをお勧めしますか?私は、PythonでUnicodeに問題がある人にとって、非常に貴重なものだと感じました。 –

+0

私はこのトピックに関する良い説明のために何か提案をするのを喜んでします。 – user1781837

答えて

1

1つのエンコーディングから別のエンコーディングに変換するには、最初に文字列をUnicodeにデコードしてから、再度ターゲットエンコーディングでエンコードする必要があります。

したがって、たとえば:

idna_encoded_bytes = b'xn--o3cw4h' 
unicode_string = idna_encoded_bytes.decode('idna') 
utf8_encoded_bytes = unicode_string.encode('utf-8') 

print (repr(idna_encoded_bytes)) 
print (repr(utf8_encoded_bytes)) 
print (repr(unicode_string)) 

Python2結果:

'xn--o3cw4h' 
'\xe0\xb9\x84\xe0\xb8\x97\xe0\xb8\xa2' 
u'\u0e44\u0e17\u0e22' 

あなたが見ることができるように、最初の行はไทยのIDNAエンコーディングで、2行目はUTF8エンコーディングで、最後の行は、UnicodeコードポイントU-0E44、U-0E17、およびU-0E22のエンコードされていないシーケンスです。

コメントへの対応
utf8_encoded_bytes = idna_encoded_bytes.decode('idna').encode('utf8') 

:ちょうど操作をチェーン、ワンステップで変換を行うに

私が始めているではありませんb'xn- -o3cw4h 'ではなく、文字列' xn-o3cw4h 'だけです。 [Python3で]

あなたには奇妙なアヒルがあります。あなたは明らかにエンコードされたデータをユニコード文字列に格納しています。それを何とかbytesオブジェクトに変換する必要があります。簡単な方法は、(紛らわしい)ASCIIエンコーディングを使用することです:

improperly_encoded_idna = 'xn--o3cw4h' 
idna_encoded_bytes = improperly_encoded_idna.encode('ascii') 
unicode_string = idna_encoded_bytes.decode('idna') 
utf8_encoded_bytes = unicode_string.encode('utf-8') 

print (repr(idna_encoded_bytes)) 
print (repr(utf8_encoded_bytes)) 
print (repr(unicode_string)) 
+0

しかし実際にそれらのどれもが 'ไทย'を吐き出していません – user1781837

+0

私はオブジェクトの 'repr()'形式を印刷して、それらが何であるかを明確にしています。 stdoutに 'ไทย'を表示させたい場合は、 'print(unicode_string)'を実行してください。 –

+0

私はまだ何かが欠けています。私が始めているのは** b ** 'xn - o3cw4h'ではなく 'xn - o3cw4h'という文字列です。 – user1781837

関連する問題