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))
Python2またはPython3を使用していますか? –
http://nedbatchelder.com/text/unipain.htmlをお勧めしますか?私は、PythonでUnicodeに問題がある人にとって、非常に貴重なものだと感じました。 –
私はこのトピックに関する良い説明のために何か提案をするのを喜んでします。 – user1781837