python技巧

unicode字符和byte字符的理解

2018-09-06  本文已影响0人  陆_志东

在python2中有两种字符类型: str(bytes)unicode , 系统默认 str(bytes)
在python3中也有两种字符类型: bytesstr(unicode) 系统默认 str(unicode)

在编码界,每种编码都有一张编码表,记录的是对应的字符与数字的对应关系.
我们所看到程序显示的字符都是编码表映射的字符,在计算机世界里其实就是一串数字
简单理解就是:字节是计算机的语言,字符串是人类语言,它们之间通过编码表形成一一对应的关系
字节也叫做字节数组是二进制数据组成的序列, 1字节 == 8bit == 2位16进制数 == 数字0~255
ASCII编码占用一字节,且只用到了一字节中的一部分(31~27)

unicode和bytes的转换

unicode --encode--> bytes
bytes --decode--> unicode

1bytes(字节) = 8位二进制位(bit)
二进制位的数值只有0和1,也就是说8位0或1组成一字节(bytes)
其实bytes就是ASCII码

中文和字母在不同编码中占用的字节

英文字母:

字节数 : 1;编码:GB2312

字节数 : 1;编码:GBK

字节数 : 1;编码:GB18030

字节数 : 1;编码:ISO-8859-1

字节数 : 1;编码:UTF-8

字节数 : 4;编码:UTF-16

字节数 : 2;编码:UTF-16BE

字节数 : 2;编码:UTF-16LE

 

中文汉字:

字节数 : 2;编码:GB2312

字节数 : 2;编码:GBK

字节数 : 2;编码:GB18030

字节数 : 1;编码:ISO-8859-1

字节数 : 3;编码:UTF-8

字节数 : 4;编码:UTF-16

字节数 : 2;编码:UTF-16BE

字节数 : 2;编码:UTF-16LE

代码示例: python3环境

英文字符在unicode和bytes的区别
s1 = "aaa"
print(type(s1),len(s1))
>><class 'str'> 3
b1 = s1.encode("utf-8")
b2 = b"aaa"
print(type(b1),type(b2),b1==b2,len(s1)==len(b2))
>><class 'bytes'> <class 'bytes'> True True

上面的示例可以看出英文字符在unicode和bytes中占相同的字节

中文字母
s1 = "中"
print(type(s1),len(s1))
>><class 'str'> 1
b1 = s1.encode("utf-8")
# b2 = b"中文" # 注意不能这样写,这样写是会报错的 
print(type(b1),b1,len(b1))
>><class 'bytes'> b'\xe4\xb8\xad' 3

上面的示例其实就可以看出,python3默认使用unicode字符,采用的默认编码是utf-8,以及一个中文占3个字节长度,所以在转换编码传输的时候要注意数据的真正长度

上一篇下一篇

猜你喜欢

热点阅读