今天在寫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