今天在写python程序的时候,遇到了编码问题,今天,我准备好好了解一下编码问题python
计算机是美国人发明的,最初只有不超过256字符须要编码,1字节能编码2**8个,因此ASCII编码就是这么来的。如今的键盘,不用输入法能打出来的字符,都在ASCII码表里。编程
后来,计算机逐渐普及,须要编码其余国家的字符,好比中文,日文,韩文,中国有GB2312等(固然,会占用多个字节),其余国家也有各自的编码表。可是这有个问题,若是一串字符有多个国家的语言,没法处理。json
Unicode将各类国家字符统一编码。这样便解决了统一编码的问题。Unicode很是适合在内存中使用,同一种语言,编码格式是相近的,便于计算。可是,当须要存储的时候,就不太合适了,浪费空间。编码
ustring = '中' print('--- Unicode ---') ubyte = ustring.encode('unicode_escape') print(len(ubyte)) print(ubyte) # 直接输出第一个\是转义 print(''.join([chr(c) for c in ubyte]))
输出结果:code
--- Unicode --- 6 b'\\u4e2d' \u4e2d
能够看到,一个中文的中
字,就占了6个字节,编码其实只有4个字节4e2d
,但\u
,也要存储内存
为了便于减少传输和存储的大小,UTF-8编码出现了。一样是中
utf-8
print('--- UTF-8 ---') ubyte = ustring.encode('utf-8') print(len(ubyte)) print(ubyte) print(''.join([chr(c) for c in ubyte]))
输出以下:ci
--- UTF-8 --- 3 b'\xe4\xb8\xad' ä¸-
只占用了3个字节,\x
是python加上去的,表明16进制方式读取,也就是e4
, b8
, ad
这三个字节。可能会有人不知道e4
为啥是一个字节,16进制和2进制对应以下,占4位,一个字节8位,因此是两个字符unicode
0 = 0000 1 = 0001 ... a = 0110 ... e = 1110 f = 1111
为啥今天我会想好好了解一下编码呢,由于我在编程的时候用到了json,有趣的是,python中json的编码方式默认使用的不是utf-8,而是unicode,我还傻傻分不清楚,晕了半天。不过使用json.dumps和json.loads其实根本遇不到这个问题string