Python里面的字符一般默認為Unicode字符,屬於str類型;而編碼則是將字符轉換成字節流的過程,反之解碼是將字節流解析為字符的過程。
所謂的字節流,在pyhton里面,屬於bytes類型。
1. python有兩種方式實現編碼和解碼:
- encode 和 decode 方法:encode()函數根據括號內的編碼方式,把str類型的字符串轉換為bytes字符串,decode反之。
b = '龍'.encode('utf-8') # '龍':unicode字符,encode進行 utf-8 編碼 print('b:',b) # 開頭的 b 字符表示bytes類型 print(type(b)) #類型是'bytes' d = b.decode('utf-8') #解碼 print('d:',d) print(type(d))
- str 和 bytes 方法
ss = bytes('龍', encoding='utf-8') # 編碼 print('ss:',ss) print(type(ss)) cc = str(ss, encoding='utf-8') # 解碼 print('cc:',cc) print(type(cc))
求編碼的字節長度,可以通過 len() 函數 對bytes類型的編碼求長度得到:
print(len(b)) #編碼的字節數,3個字節編碼,因為b就是字節類型 bytes,此時為b:b'\xe9\xbe\x99'
2. bytes函數:class bytes([source[, encoding[, errors]]]) —— 返回一個新的 bytes 對象,該對象是一個 0 <= x < 256 區間內的整數不可變序列。
參數
- 如果 source 為整數,則返回一個長度為 source 的初始化數組;
- 如果 source 為字符串,則按照指定的 encoding 將字符串轉換為字節序列;
- 如果 source 為可迭代類型,則元素必須為[0 ,255] 中的整數;
- 如果 source 為與 buffer 接口一致的對象,則此對象也可以被用於初始化 bytearray。
- 如果沒有輸入任何參數,默認就是初始化數組為0個元素。
ss = bytes('龍', encoding='utf-8') # 字符串 print('ss:',ss) print(type(ss)) s2 = bytes(12) # 整數 print('ss:',s2) s3 = bytes([12,3]) # 可迭代類型,元素必須為[0 ,255] 中的整數; print('s3:',s3)
s4 = bytes('what?', encoding='utf-8') # 字符串,英文
print('s4:',s4)
3. 亂碼:因為字符串等都是經過某一編碼方式編碼的,所以如果解碼的時候並不是對應的編碼方式,則很容易出現亂碼;此時就需要使用對應的編碼方式解碼。
(1)如果結果是一堆bytes類型的:'\x..\x..\x..',則可以直接decode,通過相應的編碼方式,例如decode('utf-8')
(2)如果是由於解碼和編碼的方法不一致,則反向先編碼再解碼即可,例如:
nn = '龍在天下'.encode('gbk') mm = nn.decode('ISO-8859-1') print('mm:',mm) #亂碼 kk = mm.encode('ISO-8859-1').decode('gbk') # 對亂碼反向解碼 print('kk:',kk)
不過一般情況下,會直接報錯,例如gbk和utf-8混用時會出現:UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc1 in position 0: invalid start byte。
最重要的是:編碼和解碼的方法最好一致。
4. 轉義字符:遇到特殊字符的時候需要用到轉義字符,就像不能直接用class來做變量一樣,python中的轉義字符主要如下:
轉義字符 | 描述 |
---|---|
\(在行尾時) | 續行符 |
\\ | 反斜杠符號 |
\' | 單引號 |
\" | 雙引號 |
\a | 響鈴 |
\b | 退格(Backspace) |
\e | 轉義 |
\000 | 空 |
\n | 換行 |
\v | 縱向制表符 |
\t | 橫向制表符 |
\r | 回車 |
\f | 換頁 |
\oyy | 八進制數,yy代表的字符,例如:\o12代表換行 |
\xyy | 十六進制數,yy代表的字符,例如:\x0a代表換行 |
\other | 其它的字符以普通格式輸出 |
所以上面經常遇到類似:b'\xe9\xbe\x99',其中 b 表示bytes類型,\x 其實表示十六進制值。
參考:
https://www.cnblogs.com/bruce-gou/p/10256151.html
https://www.runoob.com/python/python-strings.html