Python3 中的中文编码问题

来源:互联网 时间:2017-06-01

最近重新看看了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()

相关阅读:
Top