unicode字符和byte字符的理解
2018-09-06 本文已影响0人
陆_志东
在python2中有两种字符类型: str(bytes)
和unicode
, 系统默认 str(bytes)
在python3中也有两种字符类型: bytes
和 str(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个字节长度,所以在转换编码传输的时候要注意数据的真正长度