读取编码 utf-8 网页出现问题 [Non-BMP character not supported in Tk]

2015-04-01 03:07:19 +08:00
 soratadori
环境:python版本3.4,IDE是自带的那个

一般来说编码问题的话,多试几个办法总能解决,但是这个怎么也读不出来。该网页响应头返回的是 charset=UTF-8

code:
page = resp.read().decode('utf-8' )
print(page)

这样写的话用utf-8解不出来,换成其他的也解不出来。
如果在后面加上一句ignore的话,其他编码方式能解的出来了,但是出现乱码,而utf-8仍然解不出来,并且错误由第一行转移到了第二行,出现错误代码 [UnicodeEncodeError: 'UCS-2' codec can't encode characters in position 2528-2528: Non-BMP character not supported in Tk] ,由此可以推断使用utf-8是没错的。但是这个错误代码的解决方法找了半天也没找到。

有人知道怎么解决吗
5137 次点击
所在节点    Python
5 条回复
aaaa007cn
2015-04-01 08:08:47 +08:00
错误提示已经讲得很清楚了
Non-BMP character not supported in Tk
Tk 不支持 Non-BMP(非基本多文种平面)字符
而 IDLE 正是基于 Tcl/Tk 的

关于 Non-BMP 可以参考 wikipedia
https://en.wikipedia.org/wiki/Plane_%28Unicode%29

另外
问题是出在 print(page),而不是之前的 decode
显式 encode 吧
print(page.encode('utf-8'))
soratadori
2015-04-01 21:05:39 +08:00
@aaaa007cn 后面再加上 .encode('utf-8')) 我也试过,但是出来的结果是:

b'\x1f\x08\x00\x00\x00\x00\x00\x00\x03Y[\xdb\xb6\x0e~N~\x05Vv:=6M:uShkJTD\xca\xbb>\x00\xc8\x92,Yn \x0f\x04\t\x10F
aaaa007cn
2015-04-01 21:21:26 +08:00
请贴出网页地址先
soratadori
2015-04-02 02:36:04 +08:00
@aaaa007cn anidb.net,这个网站有反机器人的措施,请把请求头传送完整,不然有可能会被ban
aaaa007cn
2015-04-03 00:56:04 +08:00
服务器返回的是 gzip 压缩过的内容
即使请求中没有设定 Accept-Encoding 头

>>> import urllib.request
>>> r = urllib.request.urlopen('http://anidb.net/perl-bin/animedb.pl?show=main')
>>> r.getheader('Content-Encoding')
'gzip'

所以需要自行 gzip,如果你用 urllib 的话
>>> import gzip
>>> data = r.read()
>>> gzip.decompress(data)
b'<!DOCTYPE html>\n<html...

再次进行 decode 就可以得到 unicode 字符串
>>> gzip.decompress(data).decode('utf-8')
'<!DOCTYPE html>\n<html...

或者使用 requests
它会检查相关的 http 头然后自动解压并尝试自动解码
>>> import requests
>>> r = requests.get('http://anidb.net/perl-bin/animedb.pl?show=main')
>>> r.text
'<!DOCTYPE html>\n<html...

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/180726

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX