python与编码

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python与编码相关的知识,希望对你有一定的参考价值。

编码的概念

    编码就是将信息从一种格式转换为另一种格式。也就是说,将我们所认识的内容转换为计算机所认识的二进制格式就是一种编码的行为,而计算机将二进制格式的内容解码成我们所认识的内容。

    最早的时候计算机使用的编码规则是ASCII码,ASCII码最早是美国人使用的。ASCII码用一个字节的二进制组来表示一个字符(因为他们只用到26个引文字母和一些符号,最初的ASCII码甚至只用到7个bit位)。

    随着计算机的日益普及,ASCII码难以满足世界各地人们的使用,在中国就出现了GB2312与GBK的编码方式,使用两个字节的二进制组表示一个字符(甚至强硬的占用了拉美等国家的最高bit位)。正因为如此,世界各地都使用自己的编码方式,各自的软件都无法兼容了,所以就出现了万国码。

    万国码(Unicode)覆盖了全世界所有的文字,这也太强大了,那我们使用万国码不是很方便吗?但是对于美国人来说,他们只需要使用一个字节就可以表示所有的字符,而现在却平白无故多出一个字节,这使得内存与硬盘浪费了空间,所以Unicode优化成了现在的utf-8格式。utf-8是可变长的编码方式,所以现在开发倾向于使用这种编码方式。但是现在依然很多地方在使用GBK,ASCII等编码方式,所以对于编码我们需要详细的了解。

python2的编码

    python2中默认编码方式是ASCII码。

name = 杰夫     #str类型为bytes
name2 = u杰夫   #将字符串类型改为Unicode
print  repr(name)
print  repr(name2)


运行结果
\\xbd\\xdc\\xb7\\xf2
u\\u6770\\u592b

    在python2中str字符串类型在内存中存的是bytes类型,Unicode类型字符串存储的是Unicode数据。

    

name = 杰夫                #name为字节数据类型
name2 = u杰夫            #name为unicode数据类型
name3 = name.decode(utf8)
name4 = name2.encode(utf8)
print type(name3)
print type(name4)
print repr(name)
print repr(name2)
print repr(name3)
print repr(name4)
运行结果
<type unicode>
<type str>
\\xe6\\x9d\\xb0\\xe5\\xa4\\xab‘  #str字符串类型的bytes数据
u\\u6770\\u592b‘             #Unicode字符串类型的Unicode数据
u\\u6770\\u592b‘             #str字符串类型解码成Unicode数据
\\xe6\\x9d\\xb0\\xe5\\xa4\\xab‘  #Unicode字符串类型编码成bytes数据

python3的编码

    python3中默认的编码方式是utf-8.

name = bjeff
name2 = 杰夫
print(type(name))
print(repr(name))
print(type(name2))
print(repr(name2))
运行结果
<class bytes>
bjeff
<class str>
杰夫

    python3中str字符串类型在内存中存的是Unicode数据,bytes类型字符串存储的是bytes数据。

name = bjeff
name2 = 杰夫
name3=name.decode(utf8)
name4=name2.encode(utf8)
print(type(name))
print(type(name2))
print(type(name3))
print(type(name4))
print(repr(name))
print(repr(name2))
print(repr(name3))
print(repr(name4))
运行结果
<class bytes>
<class str>
<class str>
<class bytes>
bjeff‘                         #bytes类型字符串存储的bytes数据
杰夫‘                           #str类型字符串存储的Unicode数据
jeff‘ #bytes类型字符串解码成Unicode数据 b\\xe6\\x9d\\xb0\\xe5\\xa4\\xab‘ #str类型字符串编码城bytes数据

    简单的总结一下编码bytes数据是为了方便传输与存储,而Unicode数据方便了显示,python3比python2更加清晰化了字节与字符的界限,python3取消了python2中的不同类型字符串的拼接。

    因为编码方式的不同经常会出现下面这种情况。

    在python中写一个小程序,

#coding=utf8
print(‘杰夫‘)

  在windows终端打开此文件。

技术分享

这里显示出一堆乱码,这是为什么呢?

因为我的python3默认编码方式是utf-8,而我的windows终端默认解码方式是GBK,lianxi1.py这个文件内容在内存中以utf-8的编码方式写入硬盘,在cmd中执行时,cmd软件默认解码方式是GBK,用GBK的方式去解码utf-8的二进制数据,解码出来的就是一堆乱码,所以解决方法就是要么让cmd使用utf-8的方式来解码,否则就只能让python解释器用GBK方式将文件内容编码存入硬盘。

#coding=GBK
print(杰夫)

技术分享

 



以上是关于python与编码的主要内容,如果未能解决你的问题,请参考以下文章

如何测试文本片段是不是是 Quoted-printable 编码的

使用非utf-8编码在Python中解析XML

python编码与代码注释

你如何在 python 中处理 graphql 查询和片段?

从 XML 声明片段获取 XML 编码:部分内容解析不支持 XmlDeclaration

Python 必知的 20 个骚操作!