tips:
一直被字符編發困擾,研究了一下,搞清楚了幾個概念,也明白了之前的一些疑問,現在做個簡單記錄,可做參考,不適合系統學習字符編碼。
ascii:占一個字節,英文字母及數字
Unicode:兩個字節,萬國碼
utf-8:可變字節
字節碼:一般每個字節都用十六進制來表示的,如“我愛你”用’utf-8‘轉成字節碼為:b'\xe6\x88\x91\xe7\x88\xb1\xe4\xbd\xa0'
字節碼轉二進制:把每個字節的十六進制轉成二進制就好了(轉碼都是一一對應的,要一個一個轉,沒必要)
在python3中,默認內存中為Unicode編碼。
字符串轉字節碼:用encode,指定’utf-8'字符集。
字節碼轉字符串:用decode,也
指定’utf-8'字符集。
注意:當英文轉成字節碼時,b''后面還是英文,當中文轉成字節碼時,b''后面顯示十六進制的字節碼。
a='love' a=a.encode('utf-8') a b'love' b='愛' b=b.encode('utf-8') b b'\xe7\x88\xb1' b=b.decode('utf-8') b '愛'
encode就像加密,decode就像解密,應用的時候一定注意,用什么加密就用什么解密,所以同一字符串用不同字符集轉成的字節碼也不同。
補充:
1、python3內存中默認為unicode編碼
2、python2默認為ascii編碼,所以如果定義a='漢字',直接打印會報錯,改成如下圖,指定字符集,打印前decode
3、查整數對應的unicode字符,查漢字對應的整數
python2有unichr(),python3默認就是unicode,所以不用unichr()方法
>>> chr(28879)'烏'>>> ord('一')19968
4、因為默認就是unicode,unicode是有漢字的,所以直接定義為漢字,打印也不會報錯。
不過看到的雖然是漢字,如果要寫到文檔中不進行utf-8轉碼的話,打開文檔會亂碼。(好像默認進行utf-8轉碼)

5、字符串前面的 u
在Python2中,普通字符串是以8位ASCII碼進行存儲的,而Unicode字符串則存儲為16位unicode字符串,這樣能夠表示更多的字符集。使用的語法是在字符串前面加上前綴 u。在Python3中,所有的字符串都是Unicode字符串,所以字符串前面不需要加u也是unicode存儲
字符串前面的 r
原始字符串,轉移符等無效
6、bytes類型和string類型
bytes是比特流,也就是字節碼,2進制串,我們通常表示為16進制
string是字符串
encode()是字符串的方法,decode()是bytes類型的方法,指定字符集后相互轉換
>>> b='啊'.encode('utf8')>>> bb'\xe5\x95\x8a'>>> type(b)<class 'bytes'>
7、我們看到的任何字(漢字韓語日語)都有它的編碼方式,windows默認為gbk,linux默認為utf-8,python默認為unicode,一個文檔以什么編碼方式存,就以什么方式打開。
8、同一個漢字,用不同字符集編碼的字節碼都不同
>>> '哈'.encode('unicode-escape')b'\\u54c8'>>> '哈'.encode('utf-8')b'\xe5\x93\x88'>>> '哈'.encode('gbk')b'\xb9\xfe'