字符串以两种形式存在:
一种是给人看的形式,一种是给电脑处理用的形式:
给人看的字符要转变为储存传输的字节,用encode函数.
使用encode时,需要指定编码方式,python3默认是utf-8.(而python2是ascii).
从字节转变为为字符用,decode函数.
使用decode时,需要已知字节的编码方式,python3默认的是utf-8.
Python3:
In [1]: hex(ord('中'))
Out[1]: '0x4e2d'
In [2]: '\u4e2d'
Out[2]: '中'
In [3]: '中'.encode('utf-8')
Out[3]: b'\xe4\xb8\xad'
In [4]: '中'.encode('unicode-escape')
Out[4]: b'\\u4e2d'
n [5]: b'\u4e2d'.decode('unicode-escape')
Out[5]: '中'
In [6]: b'\xe4\xb8\xad'.decode('utf-8')
Out[6]: '中
b'\xe4\xb8\xad'
,b'\\u4e2d'
为了避免乱码问题,应当始终坚持使用UTF-8编码对str和bytes进行转换。
UTF-8的编码规则很简单,只有二条:
1)对于单字节的符号,字节的第一位设为0,后面7位为这个符号的unicode码。因此对于英语字母,UTF-8编码和ASCII码是相同的。
2)对于n字节的符号(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的unicode码。
In [1]: bin(0xe4b8ad)
Out[1]: ‘0b1110**0100**10**111000**10**101101**’
In [2]: bin(0x4e2d)
Out[2]: '0b100111000101101
1110xxxx 10xxxxxx 10xxxxxx
unicode 和 utf-8的区别:
unicode是全体字符和数字的一个映射关系,比如’A’是65,’中’是20013.
每个字符用的字节数以那个用了最大字节数的字符来确定,其他补充为0.
如果以这个映射关系进行储存传输,无疑会很浪费资源.
utf-8可以用不同个数的字节来表示字符.但是我们必须告诉计算机这个字符用了几个字节,以此来帮助计算机判断.
参考:
http://blog.csdn.net/lxdcyh/article/details/4018054
http://blog.sina.com.cn/s/blog_6d7cf9e50102vo90.html
http://blog.chinaunix.net/uid-21633169-id-4337685.html