python-编码问题(字符编码问题处理)

本文深入探讨了编码和解码的基础知识,从ASCII到Unicode,再到各种编码集如GB2312、GBK和UTF-8。讲解了Python中如何处理编码问题,包括解决乱码、源文件和终端编码,以及文件读写时的编码注意事项。
摘要由CSDN通过智能技术生成
  • 编码和解码
  • 编码集
  • 解决乱码

编码和解码

  • 编码是为了让机器读懂语言。即输入的是字符“中文”,那么编码就是将“中文”编码为二进制格式让机器读懂
  • 在Python中,机器其实是不认识unicode 的,而是接收的 str
  • 即使输入的数据是 unicode 的,而在Python内部都会将 unicode 自动转为str
    在这里插入图片描述
  • str 通过解码函数 decode() 转换为 unicode , unicode 通过编码函数 encode() 转换为 str
    在这里插入图片描述
    在这里插入图片描述

编码集

  • 电脑只”认识” 0 1 二进制数值,从一开始,人们想到的方法就是赋予每一个字符唯一的一串 0 1 编码表示。
    在这里插入图片描述
  • 这是一个ASCII编码集中对字符 A 的编码,这是一个八位 0/1 数字
    ASCII编码集
  • 在1967年出现了ASCII标准,这主要是基于拉丁字母的一套电脑编码系统
  • ASCII标准是每个英文字母有一一对应独立的 8 位数字串,比如说字母 A ,ASCII中对应的二进制值为 01000001 。这样,我在输入 A 的时候,编译器会借助编码集将 A 转换为 01000001
    在这里插入图片描述
  • ASCII总共可以存储256个字符,1967年制定这套标准的人只考虑英语世界的使用者。那么256个编码集对于使用英语和拉丁语系是够用的,但是对于中文、日文、韩文,就完全不够用了
    在这里插入图片描述

GB2312编码

  • GB2312编码集是由中国国家标准总局发布
  • 1981年5月1日实施的一套收录了6763个汉字、拉丁字母、希腊字母、日文平假名及片假名字母、俄语西里尔字母在内的682个字符的标准。但是这套标准没有包含部分罕见字和繁体字,于是后面出现GBK、GB18030在GB2312的基础上进行扩充解决。
    在这里插入图片描述

Unicode

  • Unicode是标准统一所有语言文字的标准编码集,它目前已经收录超过十万个字符
  • Unicode包括两个方面
    • 编码方式(一个字符对应编码集中的二进制数值)
    • 实现方式(传输、存储):UTF-8、UTF-16

解释乱码

解释器编码

  • Python解释器的编码指Python内部认为的字符 str 的编码,即一个 str 变量,要转换为 unicode时,Python解释器默认的转换方式
  • Python的默认转换方式是ASCII
    *sys.getdefaultencoding()*函数可以获得默认编码信息
    在这里插入图片描述
  • 在 ASCII 默认编码条件下对中文字符编码会出现错误,因为 ASCII 不能对中文进行编码
    在这里插入图片描述
  • 通过前面介绍的 encode() 函数和 decode() 函数可以设置参数,指定编码方式
  • 对中文字符进行 GBK 编码和 UTF-8 编码
    在这里插入图片描述
    在这里插入图片描述
  • 中文字符 str 的解码问题
    在这里插入图片描述
  • 想要得到 GBK 编码的 str :先对其进行 UTF-8 解码,再对其进行 GBK 编码
    在这里插入图片描述
    源文件编码
  • 源文件编码也就是代码文件的编码,文件不仅可以保存代码,而且还可以对数据进行存储
  • 文件保存数据也是有编码的,如果源文件中有中文,那么直接按照默认的编码方式运行Python文件的时候会出现编码错误,若想要在源码中写非ASCII文字,可以在源码文件开头加入一行:
    在这里插入图片描述
    或者
    在这里插入图片描述
    终端编码
  • 这个指使用终端显示的时候会出现的问题
  • windows中文版终端用的是CP936,通常被等同认为是GBK
  • 而linux系统终端用的是utf-8
  • 所以若不想在终端打印显示出来的字符出现乱码,则在打印前需要将打印的内容按照终端相同的编码方式进行转换
    文件读写编码
  • 在数据分析中,出现编码问题最多的还是在文件读写这个阶段
  • 使用 read() 读取的文件内容,得到的是 str 格式的
    在这里插入图片描述
  • 用 UTF-8 解码再用 GBK 编码打印出来的是乱码,这就是编码不同导致的乱码
    在这里插入图片描述
  • 用 write() 方法写入的时候也需要是 str 格式。也就是说,如果写入的数据是 unicode 时,将会出错

在这里插入图片描述

  • 解决办法:先将 unicode 格式编码为 str ,再写入 在这里插入图片描述

编码检测工具——chardet

  • 如果你发现常用的 gbk 、 utf-8 编码解码都没办法解决乱码问题,那么有可能该文本使用了这两种之外的编码方式
  • chardet是一个Python包,提供测试文本的编码方法,最后返回的是对编码方法的一个估计
    在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值