Python - 将unicode和hex转换为unicode

Sri*_*Sri 0 python unicode encoding mojibake

我有一个像这样的unicode字符串:

U'\ XC3\XA3\XC6\u2019\XC2版权所有\ xA9\XC3\XA3\XC6\u2019\XE2\u20ac\u201c\XC3\XA3\XC6\u2019\XC2版权所有\ xA9\XC3\XA3\XE2\u20ac\u016​​1\XC2\XA4\XC3\XA3\XC6\u2019\XE2\u20ac\u201c\XC3\XAF\XC2\XBC\XC2\X81\XC3\XA3\XE2\u20ac\u016​​1\XC2\xb9\XC3\XA3\XE2\u20ac\u016​​1\XC2\XAF\XC3\XA3\XC6\u2019\XC2\XBC\XC3\XA3\XC6\u2019\XC2\XAB\XC3\XA3\XE2\u20ac\u016​​1\XC2\XA2\XC3\XA3\XE2\u20ac\u016​​1\XC2\XA4\XC3\XA3\XC6\u2019\XE2\u20ac\XB0\XC3\XA3\XC6\u2019\XC2\XAB\XC3\XA3\XC6\u2019\XE2\u20ac\XA2\XC3\XA3\XE2\u20ac\u016​​1\XC2\XA7\XC3\XA3\XE2\u20ac\u016​​1\XC2\xb9\XC3\XA3\XC6\u2019\XE2\u20ac\XA0\XC3\XA3\XE2\u20ac\u016​​1\XC2\XA3\XC3\XA3\XC6\u2019\XC2\X90\XC3\XA3\XC6\u2019\XC2\XAB\XC3\XAF\XC2\XBC\XCB\u2020\XC3\XA3\XE2\u20ac\u016​​1\XC2\xb9\XC3\XA3\XE2\u20ac\u016​​1\XC2\XAF\XC3\XA3\XC6\u2019\XE2\u20ac\XA2\XC3\XA3\XE2\u20ac\u016​​1\XC2\XA7\XC3\XA3\XE2\u20ac\u016​​1\XC2\xb9\XC3\XAF\XC2\XBC\XE2\u20ac\XB0'

如何从中获取正确的unicode字符串?我认为,实际的unicode值是????????????????????????????

Mar*_*ers 5

你有一个Mojibake,一个错误解码的文本.

您可以使用该ftfy来取消损坏:

>>> from ftfy import fix_text
>>> fix_text(s)
u'\u30e9\u30d6\u30e9\u30a4\u30d6!\u30b9\u30af\u30fc\u30eb\u30a2\u30a4\u30c9\u30eb\u30d5\u30a7\u30b9\u30c6\u30a3\u30d0\u30eb(\u30b9\u30af\u30d5\u30a7\u30b9)'
>>> print fix_text(s)
?????!???????????????(?????)
Run Code Online (Sandbox Code Playgroud)

根据ftfy,您的数据编码为UTF-8,然后解码为Windows代码页1252; 该ftfy.fixes.fix_one_step_and_explain()功能显示了所需的维修步骤:

>>> ftfy.fixes.fix_one_step_and_explain(s)[-1]
[(u'encode', u'sloppy-windows-1252', 0), (u'decode', u'utf-8', 0)]
Run Code Online (Sandbox Code Playgroud)

(需要'草率'编码,因为并非所有UTF-8字节都可以解码为cp1252,但是一些不良解码器只是复制原始字节;特殊编解码器会反转该过程).

事实上,在你的情况下,这是两次完成,而不是我以前见过的壮举:

>>> print s.encode('sloppy-cp1252').decode('utf8').encode('sloppy-cp1252').decode('utf8')
????????????????????????????
Run Code Online (Sandbox Code Playgroud)