Python:編碼與解碼和轉義字符


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'

其中,Unicode與UTF-8的關系可見

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

https://www.runoob.com/python3/python3-func-bytes.html

https://www.jianshu.com/p/220ee0f219c6


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM