• 笔记-Python编码问题整理


    GB2312是中国规定的汉字编码,也可以说是简体中文的字符集编码

    GBK 是 GB2312的扩展 ,除了兼容GB2312外,它还能显示繁体中文,还有日文的假名

    cp936:中文本地系统是Windows中的cmd,默认codepage是CP936,cp936就是指系统里第936号编码格式,即GB2312的编码。

    (当然有其它编码格式:cp950 繁体中文、cp932 日语、cp1250 中欧语言。。。)

    Unicode是国际组织制定的可以容纳世界上所有文字和符号的字符编码方案。UTF-8、UTF-16、UTF-32都是将数字转换到程序数据的编码方案。

    UTF-8 (8-bit Unicode Transformation Format)是最流行的一种对 Unicode 进行传播和存储的编码方式。它用不同的 bytes 来表示每一个代码点。ASCII 字符每个只需要用一个 byte ,与 ASCII 的编码是一样的。所以说 ASCII 是 UTF-8 的一个子集。

    在开发Python程序的过程中,会涉及到三个方面的编码:

    Python程序文件的编码
    Python程序运行时环境(IDE)的编码
    Python程序读取外部文件、网页的编码
    
    • 1
    • 2
    • 3

    ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/9e6038acdafa4b24ad42f0ed70d0d6e5.png

    Python程序文件的编码

    例如:

    Python2自带的IDE,当创建了一个文件保存的时候提示:
    在这里插入图片描述

    这是因为Python2编辑器默认的编码是ASCII,它是无法识别中文的,所以会弹出这样的提示。这也是我们在大多情况下写python2程序的时候习惯在程序的第一行加上:#coding=utf-8

    其实,这里的编码文件是很容易解决的。

    Python程序运行时环境(IDE)的编码

    执行下面的一段程序。

    #coding=utf-8
    from selenium import webdriver
    
    driver = webdriver.Firefox()
    driver.get("http://www.baidu.com")
    
    # 返回百度页面底部备案信息
    text = driver.find_element_by_id("cp").text
    print(text)
    
    driver.close()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    在windows cmd下执行:

    在这里插入图片描述

    我们要获取的信息是:

    ©2015 Baidu 使用百度前必读 意见反馈 京ICP证030173号

    Windows cmd 用的是cp936,也就是中文的GB2312,在GBK的字符集里没有“©”,这就导致通过GBK解析的时候出现编码问题。

    这就像你在翻译英文的时候,出现了一个单词,这个单词你查遍了牛津大词典都没找到对应的含义解释,那么自然是会有问题的。

    那假设,我还就想在cmd下执行这个python程序了,那么可以去修改cmd的默认编码类型为utf-8,对应的编码为CHCP 65001(utf-8)。在cmd 下输入:chcp 65001 命令回车。
    在这里插入图片描述

    然后,修改cmd的字体为“Lucida Console”,再来执行程序就可以被正确输出了。

    在这里插入图片描述

    Python程序读取外部文件、网页的编码

    #这一块,暂时没有找到合适的例子

    查看Python系统编码

    查看Python2 或Python3的系统编码。

    Python2:

    Python 2.7.10 (default, May 23 2015, 09:40:32) [MSC v.1500 32 bit (Intel)] on win32
    Type "copyright", "credits" or "license()" for more information.
    >>> import sys
    >>> sys.getdefaultencoding()
    'ascii'
    
    • 1
    • 2
    • 3
    • 4
    • 5

    Python3:

    Python 3.5.0 (v3.5.0:374f501f4567, Sep 13 2015, 02:27:37) [MSC v.1900 64 bit (AMD64)] on win32
    Type "copyright", "credits" or "license()" for more information.
    >>> import sys
    >>> sys.getdefaultencoding()
    'utf-8'
    
    • 1
    • 2
    • 3
    • 4
    • 5

    那么如何修改Python2的系统编码为urf-8呢?

    import sys
    reload(sys)
    sys.setdefaultencoding('utf-8')
    
    • 1
    • 2
    • 3

    所以,在你的程序执行的过程中,遇到下面的报错信息时。

    UnicodeEncodeError: ‘ascii’ codec can’t encode characters in position 0-1…

    可以将上面的三行代码加到Python程序的头部。

    decode()与encode()

    decode 的作用是将其他编码的字符串转换成 Unicode 编码,eg name.decode(“GB2312”),表示将GB2312编码的字符串name转换成Unicode编码。
    encode 的作用是将Unicode编码转换成其他编码的字符串,eg name.encode(”GB2312“),表示将GB2312编码的字符串name转换成GB2312编码。
    
    • 1
    • 2

    例如,前面获取百度底部信息的例子。我还可以通过decode()与encode()来解决:
    复制代码

    #coding=utf-8
    from selenium import webdriver
    
    driver = webdriver.Chrome()
    driver.get("http://www.baidu.com")
    
    # 返回百度页面底部备案信息
    text = driver.find_element_by_id("cp").text
    text2 = text.encode("gbk","ignore").decode("gbk")
    print(text2)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    这里通过encode()将Unicode编码转换成gbk编码,在转换的过程中通过“ignore”忽略掉gbk不能识别的字符(©),然后再把gbk转换成Unicode编码。当然,这并不是一种完美的方式,毕竟牺牲部分字符串。

    chardet模块

    chardet是一个非常优秀的编码识别模块。

    通过pip 安装:

    pip install chardet

    使用:

    >>> from chardet import detect
    
    >>> a = "中文"
    
    >>> detect(a)
    {'confidence': 0.682639754276994, 'encoding': 'KOI8-R'}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    大概有68%的把握为KOI8-R编码类型。

  • 相关阅读:
    别着急,解决不了的问题,就请交给时间吧
    【C++】C++11新特性
    Hilt详解
    前后端分离项目,vue+uni-app+php+mysql电影院售票系统(H5移动项目) 开题报告
    【机器学习】面试题:LSTM长短期记忆网络的理解?LSTM是怎么解决梯度消失的问题的?还有哪些其它的解决梯度消失或梯度爆炸的方法?
    SDL3 入门(3):三角形
    MediaCodec_Analyze-1-create
    砥砺的前行|基于labview的机器视觉图像处理|NI Vision Assisant(二)——界面介绍
    ARM-day9
    模型相关术语:Model vs DTO vs Entity vs Value Object vs Pojo vs Bean
  • 原文地址:https://blog.csdn.net/java2508/article/details/139112697