使用SublimeText 2.0.2和Python 3.4.2,我得到一个带有urllib的网页:
response = urllib.request.urlopen(req)
pagehtml = response.read()
Print =&gt; qualit\xe9">\r\n\t\t<META HTTP
我在unicode字符串中得到一个“\ xe9”字符!
pagehtml的标题告诉我它是用ISO-8859-1编码的
(Content-Type: text/html;charset=ISO-8859-1
)。但如果我用ISO-8859-1解码它然后用utf-8编码它,它只会变得更糟......
resultat = pagehtml.decode('ISO-8859-1').encode('utf-8')
Print =&gt; qualit\xc3\xa9">\r\n\t\t<META HTTP
如何用相应的字母(“é”......)替换所有“\ xe9”...字符?
我收到UnicodeEncodeError
(这就是我在'utf-8'编码的原因)!
我应该提到我在SublimeText 2.0.2中运行我的代码。这似乎是我的问题。
它在IDLE(Python 3.4.2)和OSX终端(Python 2.5)中运行良好,但在SublimeText 2.0.2(使用Python 3.4.2)中不起作用... =&gt;这似乎是SublimeText控制台的问题(输出窗口),而不是我的代码。
我会按照J.F.Sebastian的建议来看PYTHONIOENCODING env
似乎我应该能够在sublime-build file
中设置它。
我刚在"env": {"PYTHONIOENCODING": "UTF-8"}
添加了sublime-build file
。
完成。谢谢大家; - )
答案 0 :(得分:2)
响应是一个编码的字节字符串。只需解码它:
>>> pagehtml = b'qualit\xe9'
>>> print(pagehtml)
b'qualit\xe9'
>>> print(pagehtml.decode('ISO-8859-1'))
qualité
答案 1 :(得分:2)
我很确定你实际上没有问题,除了理解字节与unicode之外。事情正在发挥作用。 pagehtml
是编码的字节。 (我在第一行用req = 'http://python.org'
确认了这一点。)当显示字节时,那些可以解释为可打印的ascii编码的字段就这样打印,其他字节用十六进制转义打印。 b'\xe9'
是é
的单字节ISO-8859-1编码的十六进制转义编码,b'\xc3\xa9'
是其双字节utf-8编码的十六进制转义编码。
>>> b = b"qualit\xe9"
>>> u = b.decode('ISO-8859-1')
>>> u
'qualité'
>>> b2 = u.encode()
>>> b2
b'qualit\xc3\xa9'
>>> len(b) == 7 and len(b2) == 8
True
>>> b[6]
233
>>> b2[6], b2[7]
(195, 169)
因此pageuni = pagehtml.decode('ISO-8859-1')
为您提供了unicode页面。这种解码可以替代你所要求的。
答案 2 :(得分:1)
我收到了UnicodeEncodeError(这就是为什么我在&utff-8&#39;中进行编码的原因)!我应该提到我在SublimeText中运行我的代码。这似乎是我的问题。任何解决方案?
不要手动编码,而是打印unicode字符串。
如果输出被重定向或者未配置语言环境(LANGUAGE,LC_ALL,LC_CTYPE,LANG),则设置PYTHONIOENCODING=utf-8
(默认为C(ascii))。
如果可以使用控制台代码页表示内容,则设置PYTHONIOENCODING=your_console_cp
envvar例如PYTHONIOENCODING=cp1252
(仅当它确实是控制台使用的编码时才设置为cp1252,运行{{1} } 去检查)。或者使用SublimeText可以正确显示的任何编码,如果它没有打开控制台窗口来运行Python脚本。
除非重定向输出;如果直接从命令行运行脚本,则不需要设置chcp
envvar。
否则(为了支持无法在控制台编码中表示的字符),请安装win_unicode_console
package并使用PYTHONIOENCODING
运行脚本或放在脚本顶部:
python3 -mrun your_script.py
它使用import win_unicode_console
win_unicode_console.enable()
等Win32 API打印到控制台。您仍然需要配置正确的字体以在控制台中查看任意Unicode文本。