最近重新看看了Python3,撸了点代码.被中文编码问题套路了下,查了不少资料,写了总结就作为第一篇博客吧,如果有什么问题或错误,请与我联系.
1 问题的根源
计算机不能直接识别字符(文本的最小单位)但能处理数字,于是把字符转变为数字进行处理.
所以任何信息,存放在存储介质中时,都是二进制流(比特流).
2 编码和解码
- 编码过程: 字符转换成二进制流表示的过程。
- 解码过程: 二进制流转换成字符的过程。
- 编码规则: 编码和解码过程中遵循的规则,例如GBK编码,UTF-8编码.
3 字符编码
对于字符编码的一些描述可以参考廖雪峰的字符和编码
4 乱码是如产生的
由于编码和解码使用了不兼容的字符编码方式。
解决乱码问题,需要把握的要点:
- 输入某软件系统时字符所采用的编码是什么?(从数据库或文件读取时,原来存储时的编码是什么?从网页抓取时,网页的编码是什么?从控制台输入时,控制台的编码方式是什么?)
- 软件系统中的编码方式是什么?(原本若是UTF-8存储,GBK编码的软件系统该如何处理?)
- 输出时的编码方式是什么?(如Python脚本处理后的字符串是Unicode编码,输出到采用GBK编码的Windows控制台时应该做什么?)
5 Python3中字符编码问题
Python3 中对于字符串有两种对象str和bytes
两种对象的转换方法如下
Python3 : bytes
–(decode)–> str
–(encode)–> bytes
# -*- coding: utf-8 -*-
# 原始数据 utf-8编码的
data = '''这是一个测试程序'''
# 打印data的数据类型
print('data 的类型是', type(data))
# 将data转换为bytes对象
data_bytes = data.encode('utf-8')
print('data_bytes 的数据类型是', type(data_bytes))
# 以字节流的形式将数据存入a.txt
with open('a.txt', 'wb') as f1:
f1.write(data_bytes)
#f1.close()
# 以字节流的形式读取数据
with open('a.txt', 'rb') as f2:
data_read = f2.read()
print('data_read 数据是:', data_read)
print('data_read 转码后的数据是:', data_read.decode('utf-8'))
#f2.close()
# 或者更简单的用法.open函数可以编解码保存
with open('a.txt', 'w', encoding='utf-8') as f3:
f3.write(data)
#f3.close()
with open('a.txt', 'r', encoding='utf-8') as f4:
data_read2 = f4.read()
print('data_read2:', data_read2)
#f4.close()