python3字符串编码总结str(unicode)<-->bytes

来源:互联网 发布:怎么用c语言输入n个数 编辑:程序博客网 时间:2024/05/21 06:30

1.字符串的编码形式

字符串的编码最一开始是ascii,使用8位二进制表示,因为英文就是编码的全部。后来其他国家的语言加入进来,ascii就不够用了,所以一种万国码就出现了,它的名字就叫unicode,unicode编码对所有语言使用两个字节,部分汉语使用三个字节。但是这就导致一个问题,就是unicode不仅不兼容ascii编码,而且会造成空间的浪费,于是uft-8编码应运而生了,utf-8编码对英文使用一个字节的编码,由于这样的特点,很快得到全面的使用。
1.1 ASCII

美国信息交换标准码。 在计算机的存储单元中,一个ASCII码值占一个字节(8个二进制位),但其最高位(b7)用作奇偶校验位。ASCII(American Standard Code for Information Interchange),是一种单字节的编码。计算机世界里一开始只有英文,而单字节可以表示256个不同的字符,可以表示所有的英文字符和许多的控制符号。不过ASCII只用到了其中的一半(\x80以下),这也是MBCS得以实现的基础。
1.3 Unicode、UTF-8

Unicode是业界的一种标准,它可以使电脑得以呈现世界上数十种文字的系统。 后来,有人开始觉得太多编码导致世界变得过于复杂了,让人脑袋疼,于是大家坐在一起拍脑袋想出来一个方法:所有语言的字符都用同一种字符集来表示,这就是Unicode。
Unicode把所有语言都统一到一套编码里,这样就不会再有乱码问题了。
1.4 GB2312、GBK、GB18030

GB是中国荒谬的国家标准。GB2312、GBK、GB18030各为前一个的扩展。

2.字节码bytes

python3中bytes用b’xxx’表示,其中的x可以用字符,也可以用ascii表示。python3中的二进制文件(如文本文件)统一采用字节码读写。

3.python2与python3字符串编码的区别
python默认编码

default encodings in Python are:Python 2.x: ASCIIPython 3.x: UTF-8

A. python3默认使用的是str类型对字符串编码,默认使用bytes操作二进制数据流,两者不能混淆!!
B. Python3有两种表示字符序列的类型:bytes和str。前者的实例包含原始的8位值,后者的实例包含Unicode字符。
C. Python2也有两种表示字符序列的类型,分别叫做str和Unicode,与Python3不同的是,str实例包含原始的8位值;而unicode的实例,则包含Unicode字符。

str(unicode)类型是基准!
要将str类型转化为bytes类型,使用encode()内置函数;反过来,使用decode()函数。
示例如下:

>>> s = "木又盛,你好!">>> type(s)<class 'str'>>>> t = s.encode("gbk")>>> tb'\xc4\xbe\xd3\xd6\xca\xa2\xa3\xac\xc4\xe3\xba\xc3\xa3\xa1'>>> type(t)<class 'bytes'>>>> t.decode("gbk")'木又盛,你好!'

4.len()函数
要计算str包含多少个字符,可以用len()函数

>>> len('ABC')3>>> len('中文')2

len()函数计算的是str的字符数,如果换成bytes,len()函数就计算字节数

>>> len(b'ABC')3>>> len(b'\xe4\xb8\xad\xe6\x96\x87')6>>> len('中文'.encode('utf-8'))6

最后,还有一个疑问:网页的编码??

>>>import urllib.request>>>response = urllib.request.urlopen('http://www.baidu.com')>>>html = response.read()>>>type(html)<class 'bytes'>

要正常显示的话,就要使用decode()方法了。

原创粉丝点击