-
编码和解码
编码是为了让机器读懂语言。即输入的是字符“中文”,那么编码就是将“中文” 编码为二进制格式让机器读懂在Python中,机器其实是不认识unicode的,而是接收的str即使输入的数据是unicode的,而在Python内部都会将unicode自动转为str
str通过解码函数decode()转换为unicode,unicode通过编码函数encode()转换为str
Unicode是标准统一所有语言文字的标准编码集, 它目前已经收录超过十万个字符
Unicode包括两个方面
编码方式(一个字符对应编码集中的二进制数值)
实现方式(传输、存储):UTF-8、UTF-16Python 2.x版本有两种用于字符处理的数据格式:str和 unicode
str 字节流是以两个单引号 ‘ ’ 或两个单引号 “ ” 来赋值的,访问一个元素就是一个字节
unicode 字符串是在 ‘ ’ 或 “ ” 前加 u 来赋值的,同时访问一个元素则是一个 字符Python 3.x版本有两种表示字符串的类型:bytes 和 str
str 类中包含 了 unicode 字符,非 unicode 编码如 UTF-8、GBK被定义成了 bytes使用 encode() 和 decode() 函数进行相互转换
eg: c = "中文" print(type(c), c) # 使用utf-8将str类型编码为bytes类型 c = c.encode('utf-8') print(type(c), c) # 使用默认方式将bytes类型解码为str类型 c = c.decode() print(type(c), c) 输出结果: <class 'str'> 中文 <class 'bytes'> b'\xe4\xb8\xad\xe6\x96\x87' <class 'str'> 中文
-
解决乱码
如果出现乱码的状况,那肯定是编码转码出现了问题,这不外乎有以下几个关键点:
Python解释器设置的默认编码
源文件设置的编码
终端编码 -
解释器编码
Python解释器的编码指Python内部认为的字符str的编码,即一个str变量,要转换为unicode时,Python解释器默认的转换方式Python的默认转换方式是ASCII,sys.getdefaultencoding() 函数可以获得默认编码信息
在ASCII默认编码条件下对中文字符编码会出现错误,因为 ASCII不能对中文进行编码
eg: a = u'中文' a.encode() #输出会报错
对中文字符进行 GBK 编码和 UTF-8 编码
a = u'中文' a.encode('gbk') a.encode('utf-8')
中文字符 str 的解码问题
a = '中文' a.decode('utf-8') a.decode('gbk')
想要得到 GBK 编码的 str :先对其进行 UTF-8 解码,再对其进行 GBK 编码
a = '中文' a.decode('utf-8').encode('gbk')
-
源文件编码
源文件编码也就是代码文件的编码,文件不仅可以保存代码,而且还可以对数据进行存储
文件保存数据也是有编码的。
如果源文件中有中文,那么直接按照默认的编码方式运行Python文件的时候会出现编码错误,若想要在源码中写非ASCII文字,可以在源码文件开头加入一行:# coding: utf-8 或者 # coding: gbk
-
终端编码(cmd)
windows中文版终端用的是CP936,通常被等同认为是GBK而linux系统终端用的是utf-8
所以若不想在终端打印显示出来的字符出现乱码,则在打印前需要将打印的内容按照终端相同的编码方式进行转换
-
文件读写编码
#使用 read() 读取的文件内容,得到的是 str 格式的 f = open('zhongwen.txt','r') content = f.readlines() f.close print type(content[1][0]) 输出结果: 'str' #用UTF-8解码再用GBK编码打印出来的是乱码,这就是编码不同导致的乱码 print content[1][0].decode('utf-8').encode('gbk') #用write()方法写入的时候也需要是str格式。也就是说,如果写入的数据是unicode时,将会出错 f = open('zhongwen.txt','w') f.write(u'中文') f.close() 输出会报错 #解决办法:先将 unicode 格式编码为 str ,再写入 f = open('zhongwen.txt','w') f.write(u'中文'.encode('utf-8')) f.close()
-
编码检测工具
如果你发现常用的gbk、utf-8编码解码都没办法解决乱码问题,那么有可能该文本使用了这两种之外的编码方式chardet是一个Python包,提供测试文本的编码方法,最后返回的是对编码方法的一个估计
eg: import chardet txt = "中文" print chardet.detect(txt) 输出结果: {'confidence': 0.99, 'encoding': 'utf-8'}
Python学习——编码和解码
猜你喜欢
转载自blog.csdn.net/narutodzx/article/details/105302410
今日推荐
周排行