unicode
文字列のrepr()
出力を印刷した場合は、Mojibake、不適切なエンコードを使用してバイトデータがデコードされているように見えます。
最初にエンコードしてから、正しいコーデックを使用してデコードします。これはラテン-1などのエンコードのような単純なことがあります。これは、間違って復号化がしかし、適用された方法によって異なり
unicode_string.encode('latin1').decode('utf8')
。 CP1252の範囲外のUTF-8バイトが強制的にデコードされた場合、Windowsコードページ(CP1252など)を使用した場合、実際にはエンコードできないUnicodeデータがCP1252に戻ってしまう可能性があります。
このような間違いを修復する最良の方法は、様々なコーデックの強制復号化されたモジバークテキストを処理する方法を知っているftfy
libraryを使用することです。あなたの小さなサンプルについて
、ラテン-1 はうまく動作しを表示されます。
>>> unicode_string = u'\xE5\xB1\xB1\xE4\xB8\x9C \xE6\x97\xA5\xE7\x85\xA7'
>>> print unicode_string.encode('latin1').decode('utf8')
山东 日照
>>> import ftfy
>>> print ftfy.fix_text(unicode_string)
山东 日照
あなたは2桁の数字が続くリテラル文字\
、x
を、持っている場合は、エンコーディングの別の層を持っていますここで、バイトはそれぞれ4文字で置き換えられます。あなたはstring_escape
コーデックでエスケープを解釈するためにはPythonを尋ねることによって、最初の「復号」に実際のバイトにそれらを持っていると思います:
>>> unicode_string = ur'\xE5\xB1\xB1\xE4\xB8\x9C \xE6\x97\xA5\xE7\x85\xA7'
>>> unicode_string
u'\\xE5\\xB1\\xB1\\xE4\\xB8\\x9C \\xE6\\x97\\xA5\\xE7\\x85\\xA7'
>>> print unicode_string.decode('string_escape').decode('utf8')
山东 日照
'string_escape'
を、それがに安全であるので、バイト文字列を生成パイソン2のみコーデックです後でそれをUTF-8としてデコードします。
ありがとう、Martijn、文字列を含むdictを印刷すると '{u'qualifier ':u'name'、u'timestamp ':u'1462275769186'、u'value ':u' \ \ xE5 \\ x8E \\ x9F \\ xE6 \\ x9D \\ xA5 \\ xE6 \\ x98 \\ xAフォリビア\\ xE5 \\ x95 \\ x8A '、u'columnFamily':u'interActive '、u'type '':u'Put '、u'row':u'1771897264 '} '' print m.get(' value ')。encode(' latin1 ')。decode(' utf8 ') 'まだ印刷する\ xE5 \ x8E \ x9F ... ' – armnotstrong
@armnotstrong:あなたはバイトを持っていません。 *リテラル*、バックスラッシュ、 'x'文字、16進数があります。ここには別の問題があります。これでも何ができますか? –
@armnotstrong:更新済み。あなたの質問から、あなたに文字通りのテキストがあることははっきりしていませんでした。将来、そのような文字列の 'repr()'出力を表示してください(これは、あなたのコメントで使用した 'dict()'表現が各キーと値のために使用したものです) –