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