首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Python中将HTML非ASCII数据编码为UTF-8

如何在Python中将HTML非ASCII数据编码为UTF-8
EN

Stack Overflow用户
提问于 2010-03-08 00:15:17
回答 3查看 10.3K关注 0票数 2

我尝试过这样做,但我发现了以下错误:

代码语言:javascript
复制
>>> 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语句时,我希望:

代码语言:javascript
复制
>>> print x  
u'Inglês'  

欢迎任何帮助。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-03-08 00:22:28

在解码之前,您需要知道输入数据是如何编码的。在某些尝试中,您试图从UTF-8解码它,但是Python抛出了一个异常,因为输入不是有效的UTF-8。看起来可能是拉丁语-1。这对我来说很有效:

代码语言:javascript
复制
>>> x = 'Ingl\xeas'
>>> print x.decode('latin1')
Inglês

你提到了“非ASCII HTML”。如果您正在编写web服务器脚本并从HTTP请求中获取数据,则应检查Content-Type标头。在理想情况下,它会告诉您客户端正在对数据使用哪种编码。请记住,客户端可能无法正常工作。

希望这能有所帮助!

票数 7
EN

Stack Overflow用户

发布于 2010-03-08 00:24:08

代码语言:javascript
复制
Ingl\xeas

不是UTF-8,而是Windows-1252或latin1编码的。所以你首先需要解码它。只有这样,您才能将其编码为UTF-8。

因此:

代码语言:javascript
复制
>>> x = 'Ingl\xeas'
>>> print x.decode("cp1252")
Inglês

类似地,

代码语言:javascript
复制
 >>> x.decode("cp1252").encode("UTF-8")
 'Ingl\xc3\xaas'

这是正确的UTF-8表示。

顺便说一下,在Python 3中,您可以(至少在Windows下的交互式控制台中)简单地输入

代码语言:javascript
复制
>>> x = 'Ingl\xeas'
>>> print (x)
Inglês

因为Python3字符串总是Unicode字符串(不包括bytes对象)。

票数 0
EN

Stack Overflow用户

发布于 2010-03-08 08:19:10

一些观察结果:

(1) latin1将对任何8位字节进行解码,不会抛出异常。仅当您已用尽所有其他可能性时才使用latin1。使用chardet帮助确定特定文件、网页或XML流的编码格式。

(2)基于非常有限的证据的可能的替代方案(一个字符):

代码语言:javascript
复制
>>> 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之后,您还没有摆脱困境。检查该范围内的字符。如果发现任何错误,则说明您的数据已损坏,或者您选择的编码不正确。

代码语言:javascript
复制
def check_for_c1_control_characters(unicode_obj):
    return any('\u0080' <= c <= '\u009F' for c in unicode_obj)

或者使用正则表达式,例如在this example中,说明如何修复可能损坏数据的多种方法之一。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2396925

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档