鱼C论坛

 找回密码
 立即注册
查看: 36862|回复: 85

[作品展示] 一次性解决你所有的编码检测问题

    [复制链接]
发表于 2015-11-8 03:07:29 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
在日常使用中,我们难以避免会遇到编码转换问题。(如果编码是什么都不知道,请先看:什么是编码?

而进行编码转换的前提是你知道这个字符串使用的是什么编码。

比如你使用 urllib.request.urlopen() 获取一个网页时,你特么如果不知道网页的编码会怎样?
7.gif

直接 read().decode() 就可能会出现下边错误:

BaiduShurufa_2015-11-8_2-8-2.png

这是因为无论是 encode() 还是 decode(),默认采取的编码/解码都是 encoding="utf-8" 编码……

虽然你大 UTF-8 行迹踏遍天下,但在这神州大地,处处都有奇葩的好不?
4.gif

这时候需要一个可靠的方式来检测字符串到底是什么编码,这样我们才能对症下药!


这里小甲鱼向大家推荐一个不错的模块:chardet,使用它就可以检测字符串的编码。

chardet 模块可以检测以下编码:

  • ASCII, UTF-8, UTF-16 (2 variants), UTF-32 (4 variants)
  • Big5, GB2312, EUC-TW, HZ-GB-2312, ISO-2022-CN (Traditional and Simplified Chinese)
  • EUC-JP, SHIFT_JIS, CP932, ISO-2022-JP (Japanese)
  • EUC-KR, ISO-2022-KR (Korean)
  • KOI8-R, MacCyrillic, IBM855, IBM866, ISO-8859-5, windows-1251 (Cyrillic)
  • ISO-8859-2, windows-1250 (Hungarian)
  • ISO-8859-5, windows-1251 (Bulgarian)
  • windows-1252 (English)
  • ISO-8859-7, windows-1253 (Greek)
  • ISO-8859-8, windows-1255 (Visual and Logical Hebrew)
  • TIS-620 (Thai)


chardet 模块安装方法:

1. (推荐)使用 pip 安装,打开命令行窗口(Windows 的 cmd,Linux 的 terminal,Mac 的“终端”)

输入命令:pip install chardet

BaiduShurufa_2015-11-7_17-11-0.png


2. 下载安装包并解压: chardet-2.3.0.tar.gz (160.49 KB, 下载次数: 2187)

打开命令行窗口(同上),切换目录到上方解压包的文件夹,输入命令:C:\Python34\python.exe setup.py install

BaiduShurufa_2015-11-8_2-36-17.png


chardet 模块用法:

非常简单,使用该模块的 detect() 函数即可:
  1. >>> import urllib.request
  2. >>> response = urllib.request.urlopen("http://bbs.fishc.com").read()
  3. >>> import chardet
  4. >>> chardet.detect(response)
  5. {'confidence': 0.99, 'encoding': 'GB2312'}
复制代码

哦,confidence 是可信度的意思……

0.99 就是 99% 确定是 'GB2312'!

年轻人,你太傲娇了,偶其实使用的是 GBK 编码(GBK 是 GB2312 的扩展)

6.gif

所以你直接 decode('GB2312') 还是会报错的:
  1. >>> response.decode("GB2312")
  2. Traceback (most recent call last):
  3.   File "<pyshell#41>", line 1, in <module>
  4.     response.decode("GB2312")
  5. UnicodeDecodeError: 'gb2312' codec can't decode byte 0xfd in position 22581: illegal multibyte sequence
复制代码


你现在有两种选择:

一、忽略识别不出的字符(GB2312 支持的汉字比较少,如果用这种方法会出现小部分乱码)

  1. >>> response.decode("GB2312", "ignore")
  2. ……
  3. <ul><li># <a href="thread-64400-1-1.html" title="乔布斯最精彩演讲:这三个故事决定了我的一生" target="_blank">乔布斯最精彩演讲:这三个故事决定了我的一</a></li><li># <a href="thread-50608-1-1.html" title="42个锻炼大脑的方法,你想不聪明都不行!" target="_blank">42个锻炼大脑的方法,你想不聪明都不行!</a></li><li># <a href="thread-23917-1-1.html" title="潘靠赐辏泪流满面(转)" target="_blank">潘靠赐辏泪流满面(转)</a>
  4. ……
复制代码


二、(推荐)由于 GBK 是向下兼容 GB2312,因此你检测到是 GB2312,则直接用 GBK 来编码/解码

  1. >>> if chardet.detect(response)['encoding'] == 'GB2312':
  2.         response.decode('GBK')
  3. ……
  4. <ul><li># <a href="thread-64400-1-1.html" title="乔布斯最精彩演讲:这三个故事决定了我的一生" target="_blank">乔布斯最精彩演讲:这三个故事决定了我的一</a></li><li># <a href="thread-50608-1-1.html" title="42个锻炼大脑的方法,你想不聪明都不行!" target="_blank">42个锻炼大脑的方法,你想不聪明都不行!</a></li><li># <a href="thread-23917-1-1.html" title="屌丝看完,泪流满面(转)" target="_blank">屌丝看完,泪流满面(转)
  5. ……
复制代码


评分

参与人数 23荣誉 +94 鱼币 +92 贡献 +56 收起 理由
fc5igm + 3 感谢楼主无私奉献!
白灬纸 + 2 + 2 + 2
大马强 + 5 + 5 + 3
城中城 + 4 + 4 + 3 无条件支持楼主!
莫待无花空折枝 + 3 方便
旃檀木 + 5 + 5 + 3
春見KSM + 5 + 5 + 3 良心
齐大胖 + 5 + 5 + 3 有女朋友了也要娶回家,娶回家娶回家!!!.
Agitating + 5 + 5 + 3 一下子解决了作业中各种头疼的编码问题
薄荷的琦姑娘 + 3 棒棒棒啊

查看全部评分

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-11-8 18:28:17 | 显示全部楼层
甲鱼哥给力
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-11-9 15:58:57 From FishC Mobile | 显示全部楼层
学习了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-11-10 15:39:53 | 显示全部楼层
觉得只提供了些资源而已,还是要通过自身的判断。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 2 反对 0

使用道具 举报

发表于 2015-11-16 20:51:11 | 显示全部楼层
然而,encode的时候出问题了:
捕获.JPG
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-11-30 20:35:29 | 显示全部楼层
谢谢小甲鱼!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-3-2 11:49:01 | 显示全部楼层
我早看到就好了,之前写爬虫的时候各种编码问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2016-3-2 11:51:17 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-7-19 17:30:30 | 显示全部楼层
学习了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-7-19 18:39:35 | 显示全部楼层
学习了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-7-20 14:02:52 | 显示全部楼层
>>> file = rq.urlopen("http://www.sina.com")
>>> html = file.read()
>>> chardet.detect(html)
{'confidence': 0.0, 'encoding': None}
检查新浪的网页编码,为啥是None,而且可信度为0
甲鱼哥哥,这是为啥了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 3 反对 0

使用道具 举报

发表于 2016-7-27 12:38:41 | 显示全部楼层
楼主,您好:
        我就按照第二个方法安装的chardet,而且安装成功,刚开始可以导入到python里,当我重新打开IDLE时,import chardet,显示不存在,请问这是什么原因?谢谢大家
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-7-27 16:22:57 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-7-29 14:06:53 | 显示全部楼层
学习啦,之前写爬虫可是为了这个编码问题头疼半天了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-8-2 10:21:57 | 显示全部楼层
学习到了!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-8-16 21:24:44 | 显示全部楼层
很有帮助
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-9-16 10:16:21 | 显示全部楼层
Python 神奇的地方真是太多!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-9-21 16:00:14 | 显示全部楼层
赞一个
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-12-1 11:42:40 | 显示全部楼层
灰常棒棒哒
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-12-22 23:04:42 | 显示全部楼层
厉害了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-3-28 16:22

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表