python字符编码问题处理

编码

编码目的是让机器读懂语言
在python中,Python接受的是str
即使输入的数据是其它格式,在Python内部都会自动转为str

  • 编码集

因为电脑是根据二进制工作的,所以将二进制与每个字符对应起来形成一张表使得人类的语言能够让计算机读懂。例:ASCII集

  • ASCII编码集
    只考虑到英语世界的使用者,但是对于中文、日文、韩文就不够用了
  • GBK编码集
    GB2312由中国国家标准总局发布
    包括了汉字、拉丁字母、希腊字母、日文平假名及片假名字母、俄语西里尔字母在内。但是灭有包括罕见字和繁体字,于是后来出现GBK、GB1830
  • Unicode标准编码集
    是标准统一所有语言文字的标准编码集
    • 编码方式:一个字符对应编码集中的二进制数值
    • 实现方式(传输、储存):UTF-8、UTF-16
      本质上来说:Unicode是字符集,UTF-8是编码规则
    • 字符集: 为每一个「字符」分配一个唯一的 ID(学名为码位 / 码点 / Code Point);
    • 编码规则: 将「码位」转换为字节序列的规则(编码/解码 可以理解为 加密/解密 的过程)
  • Python3中的字符串

Python3中有两种表示字符串的类型:bytesstr,str类中包含了unicode字符串,非unicode编码如UTF-8、GBK被定义成了bytes
此处UTF-8定义为了非unicode编码的原因是,UTF-8是基于unicode的编码规则,但是与unicode有所不同,UTF-8合理地节省了位数,但是仍然是基于unicode的字符集
例:

c = '中文'
print(type(c),c)

c = c.encode('utf-8')#使用UTF-8将str类型编码为bytes类型
print(type(c),c)

c = c.decode()#使用默认方式将bytes类型解码为str类型
print(type(c),c)

#运行结果
#<class 'str'> 中文
#<class 'bytes'> b'\xe4\xb8\xad\xe6\x96\x87'
#<class 'str'> 中文

python3中encode()是将str类型转换为bytes类型,decode()是将bytes类型转换为str类型

解决乱码

  • Python解释器的编码问题
    指Python内部认为的字符str的编码,即一个str变量要转换为unicode时,Python解释器默认的转换方式不同导致乱码
    Python2默认转换方式是ascii码(不包含中文)
    可能原因:因为英文的unicode编码和ascii码编码相同
    Python3默认转换方式是utf-8,不会产生乱码
    在ASCII默认编码条件下对中文字符编码会出现错误,因为ASCII不能对中文进行编码
  • 中文字符str的解码问题
a = '中文'
print(a.encode('utf-8').decode('utf-8'))
#运行结果
#中文
a = '中文'
print(a.encode('utf-8').decode('gbk'))
#运行结果
#---------------------------------------------------------------------------
#UnicodeDecodeError                        Traceback #(most recent call last)
#~\AppData\Local\Temp\ipykernel_29164\1802307138.py in <module>
#      1 a = '中文'
#----> 2 print(a.encode('utf-8').decode('gbk'))

#UnicodeDecodeError: 'gbk' codec can't decode byte 0xad in position 2: illegal multibyte sequence

出现问题的原因为a中的str是属于Unicode编码集的,用GBK就会出错了

  • 文件读写编码
    使用read()读取文件内容,得到文件内容的格式如果不是utf-8
    而终端编码是utf-8与字符串编码方式不匹配,那么会导致乱码

总结

重中之重在于解决编码方式不同的问题,编码方式不同就会产生乱码

posted @ 2023-02-03 22:49  小谢继续学  阅读(72)  评论(0编辑  收藏  举报