字是给人看的而计算机只能处理数字。所以针对字需要编码。
那么怎样将字进行编码?
首先,挖了第一个坑,人们望着键盘上的字母、数字、符号掐指一算127个数字。 二进制 2的8次方为 256 戳戳有余,于是乎规定了 1个二进制位为1个 bit,8个二进制位为一个字节 byte,这样一个 byte 就可以用二进制最大数11111111 或者十进制最大数255代表“所有的字”了。
然而,他们忽略了大洋彼岸的大中华,霓虹,大朝鲜这些字量巨大的文化大国。本着取资本主义精华的精神各国制定了自己的字编码GB2312/Shift_JIS/Euc-kr 。然而问题来了,随着亚洲全面崛起,文化不断交流,中文+日文+韩文混用就会冲突(虽然日文假名本来就大量汉字).... 就会产生让程序猿捉狂的乱码。
这个时候,世界人民迫切需要一种包罗万象的编码,于是乎Unicode应运而生,怎么办到的呐?一个 byte 不够用,用两个 byte 嘛,实在不行三个 byte…. 可是那个年代呀,存储昂贵,带宽昂贵,英文国家白白浪费2倍加的空间呀,不能为了世界和平而自损三千呀。那怎么呐? 那就byte 变长呗。于是乎就变成了英文1个 byte,中文3个 byte,生僻字4-6个 byte,顺便还兼容了ASCII。其中UTF-8(8-bit Unicode Transformation Format)作为一种针对Unicode的可变长度字符编码,被广泛应用,完美收关。
回到 Python话题,岁月不饶人,在世界人民统一认识到Unicode才是未来的时候已经是1994年了。那么91年公开发布的 Python 自然默认还是沿用了ASCII。 作为变通Python2里所有的非英文都使用了u'...' 代表Unicode字符串。直到2008的 Python3才统一使用Unicode。已是后话。
#!/usr/bin/env python2
# -*- coding: utf-8 -*-
>>> print u'非英文'
非英文
>>> u'非英文'
u'\u975e\u82f1\u6587'
>>> u'非英文'.encode('utf-8')
'\xe9\x9d\x9e\xe8\x8b\xb1\xe6\x96\x87'
>>> '\xe9\x9d\x9e\xe8\x8b\xb1\xe6\x96\x87'.decode('utf-8')
u'\u975e\u82f1\u6587'
>>> print u'\u975e\u82f1\u6587'
非英文
漂亮的分割线
2008年,祖国承办了盛大的奥林匹克运动大会。Python3也迈进了Unicode,从此
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
>>> print("北京欢迎你") # 因为Unicode 所以默认就支持了中文
北京欢迎你
>>> "北京欢迎你".encode('utf-8') # 字符串编码为字节流
b'\xe5\x8c\x97\xe4\xba\xac\xe6\xac\xa2\xe8\xbf\x8e\xe4\xbd\xa0'
>>>b'\xe5\x8c\x97\xe4\xba\xac\xe6\xac\xa2\xe8\xbf\x8e\xe4\xbd\xa0'.decode('utf-8') #从字节流解码为字符串
'北京欢迎你'
现在,Python 的字符串类型str,在计算机内存中以Unicode表示,传输到网络或者保存到磁盘,需要将str字符串转成例如encode('utf-8')以字节为单位的bytes。