我尝试过这样做,但我发现了以下错误:
>>> import re
>>> x = 'Ingl\xeas'
>>> x
'Ingl\xeas'
>>> print x
Ingl�s
>>> x.decode('utf8')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.6/encodings/utf_8.py", line 16, in decode
return codecs.utf_8_decode(input, errors, True)
UnicodeDecodeError: 'utf8' codec can't decode bytes in position 4-5: unexpected end of data
>>> x.decode('utf8', 'ignore')
u'Ingl'
>>> x.decode('utf8', 'replace')
u'Ingl\ufffd'
>>> print x.decode('utf8', 'replace')
Ingl�
>>> print x.decode('utf8', 'xmlcharrefreplace')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.6/encodings/utf_8.py", line 16, in decode
return codecs.utf_8_decode(input, errors, True)
TypeError: don't know how to handle UnicodeDecodeError in error callback 当我使用print语句时,我希望:
>>> print x
u'Inglês' 欢迎任何帮助。
发布于 2010-03-08 00:22:28
在解码之前,您需要知道输入数据是如何编码的。在某些尝试中,您试图从UTF-8解码它,但是Python抛出了一个异常,因为输入不是有效的UTF-8。看起来可能是拉丁语-1。这对我来说很有效:
>>> x = 'Ingl\xeas'
>>> print x.decode('latin1')
Inglês你提到了“非ASCII HTML”。如果您正在编写web服务器脚本并从HTTP请求中获取数据,则应检查Content-Type标头。在理想情况下,它会告诉您客户端正在对数据使用哪种编码。请记住,客户端可能无法正常工作。
希望这能有所帮助!
发布于 2010-03-08 00:24:08
Ingl\xeas不是UTF-8,而是Windows-1252或latin1编码的。所以你首先需要解码它。只有这样,您才能将其编码为UTF-8。
因此:
>>> x = 'Ingl\xeas'
>>> print x.decode("cp1252")
Inglês类似地,
>>> x.decode("cp1252").encode("UTF-8")
'Ingl\xc3\xaas'这是正确的UTF-8表示。
顺便说一下,在Python 3中,您可以(至少在Windows下的交互式控制台中)简单地输入
>>> x = 'Ingl\xeas'
>>> print (x)
Inglês因为Python3字符串总是Unicode字符串(不包括bytes对象)。
发布于 2010-03-08 08:19:10
一些观察结果:
(1) latin1将对任何8位字节进行解码,不会抛出异常。仅当您已用尽所有其他可能性时才使用latin1。使用chardet帮助确定特定文件、网页或XML流的编码格式。
(2)基于非常有限的证据的可能的替代方案(一个字符):
>>> import unicodedata as ucd
>>> for codepage in range(1250, 1259):
... try:
... uc = "\xea".decode(str(codepage))
... except UnicodeDecodeError:
... pass
... if uc == u'\xea': print codepage, ucd.name(uc)
...
1252 LATIN SMALL LETTER E WITH CIRCUMFLEX
1254 LATIN SMALL LETTER E WITH CIRCUMFLEX
1256 LATIN SMALL LETTER E WITH CIRCUMFLEX
1258 LATIN SMALL LETTER E WITH CIRCUMFLEX
>>>(3)范围U+0080到U+009F (包括)被分配给"C1控制字符“,unicode.org之外没有人知道它们有什么用处。无论您使用哪种编码(甚至是UTF-8),在无异常地解码到unicode之后,您还没有摆脱困境。检查该范围内的字符。如果发现任何错误,则说明您的数据已损坏,或者您选择的编码不正确。
def check_for_c1_control_characters(unicode_obj):
return any('\u0080' <= c <= '\u009F' for c in unicode_obj)或者使用正则表达式,例如在this example中,说明如何修复可能损坏数据的多种方法之一。
https://stackoverflow.com/questions/2396925
复制相似问题