zoukankan      html  css  js  c++  java
  • 【转】一次性解决所有的编码检测问题

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

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

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

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

    <ignore_js_op> 

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

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

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


    这里小甲鱼向大家推荐一个不错的模块: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

    <ignore_js_op> 


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

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

    <ignore_js_op> 


    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 的扩展)

    <ignore_js_op> 

    所以你直接 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. ……
    复制代码
  • 相关阅读:
    Oracle-创建PDB
    win10怎么看IP地址、怎么看主机名
    怎么读dll文件
    Windows的注册表是什么?
    DbHelperOra类的相关链接(没看)
    C#中//注释和///注释的区别
    有关C#的序列化
    【智能指针 | 01】std::shared_ptr的使用教程
    coreump
    d
  • 原文地址:https://www.cnblogs.com/themost/p/6603282.html
Copyright © 2011-2022 走看看