Python3的编码问题(笔记)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_44613063/article/details/87126006

对Python3的编码问题一直不太在意,毕竟很少用python操作文件和各种文档,这不最近写脚本的时候就遇到了问题,简单来讲就是将 txt 文件的内容提取出来后与 html 标签拼接成字符串,再写进 html 文件成为完整的标签内容,本来是一个很简单的操作。
而问题就出在中文编码上,不管是提取出来的,还是在代码中写的,在最后写进 html 文件中时,都会成为乱码(只有中文是乱码)。

因为我在 html 中设置的是 UTF-8 编码格式,而 txt 是的 GBK 编码,所以开始我也是有点懵,想当然地采用 encode() 的方法,以为这是变换格式,但这只不过是把字符串以不同格式编码为字节流 bytes 而已,而且还无法与字符拼接,搞了半天都不知道要改什么。
然后才知道每个文件的编码格式要在文件操作上确认好,打开文件的时候确定 encoding 的格式,并不是我以为的字符格式改变后再写进文件里面,甚至我还把字节转化成字符串再操作,无疑是南辕北辙,还好最后找到正确的方法操作成功了。

其实Python3已经是很好地解决了字符串的设计缺陷,而且Python2才是有编码上的大坑。
因为python2还有解码操作并把字符串牵强地分为 unicode 和 str 两种类型,虽然不是什么bug,但容易误导开发者,也算是历史遗留问题了,还好我没用过Python2。
Python3的字符串编码是unicode码,而整个文件内容则是根据确定好的编码格式来编码,解决问题就容易多了。


如果不把问题搞清楚,那么以后还是会遇到麻烦,但一般来说,只有中文才会出现乱码。实际上,要区分以下编码:系统默认编码(cmd,widows的默认编码,linux的默认编码),编辑界面编码(编辑界面显示文本的编码),运行界面编码(运行界面显示文本的编码),代码文件(py文件)编码,读入的文本编码,写出的文本编码。

看起来感觉好麻烦,但是我们需要注意的地方其实也不多。

解读

1.头文件编码声明,例如: # coding: utf-8

Python3编译器在读取该.py文件时,用的解码格式,只和读取有关,确定代码编辑时用的编码格式。在Python3编译器读取.py文件时,若没有头文件编码声明,则默认使用 utf-8 来对.py文件进行解码。

2.使用 open() 时最好加上 encoding

如果不加上,就会自动使用本地默认编码,在Windows中是gbk格式,再Linux中是utf-8格式。要根据被读取文件的编码格式来选择,写入时也要注意被写入内容的格式。

open() 打开文件只能写入 str 类型,不管字符串是什么编码方式。

3.系统默认编码

“系统”不是指操作系统,可以理解为Python3的编译器本身,Python3默认是 UTF-8

4.本地默认编码

指操作系统的编码

5.‘str’ 编码成 ‘bytes’,‘bytes’ 解码成 ‘str’

encode() 负责字符到字节的编码转换
decode() 负责字节到字符的解码转换

encode
decode
str
bytes

bytes 表示字符的原始8位值,str 表示 Unicode 字符。

在Python3里,只有 Unicode 编码格式的才能叫作 str。其他编码格式的统统都叫bytes,如:gbk,utf-8,gb2312…

Unicode编码就像是一个枢纽,例如gbk的格式要想转化成utf-8,那么必须先转化成Unicode,然后再从Unicode转化成utf-8。

gbk
Unicode
utf-8

猜你喜欢

转载自blog.csdn.net/weixin_44613063/article/details/87126006
今日推荐