1. 程式人生 > >文本和字節序列

文本和字節序列

問題 負責 如果 解碼 默認 分享圖片 函數 python 編碼

utf-8與unicode

在一般情況下,在內存中的使用的是unicode,而在存儲或者傳輸時,使用的utf-8.因為utf-8是是不定長,可以減少存儲的空間,或者傳輸時的帶寬的占用.

如何理解編碼與解碼呢?

從 Python 3 的 str 對象中獲取的元素是 Unicode 字符,這相當於從 Python 2 的 unicode 對象中獲取的元素,而不是從Python 2 的 str 對象中獲取的原始字節序列。

>>> s = ‘café‘
>>> len(s) # ?
4
>>> b = s.encode(‘utf8‘) # ?
>>> b
b‘caf\xc3\xa9‘ # ?
>>> len(b) # ?
5
>>> b.decode(‘utf8‘) # ?
‘café
  • 變量s是一個unicode編碼,需要將它轉換成字節序列,需要對它進行編碼.這裏,可以想想數據通信時,也不是需要編碼的嗎?.encode()
  • 字節序列需要解碼,.decode()

處理文本文件

技術分享圖片
要盡早把輸入(例如讀取文件時)的字節序列解碼成字符串。這種三明治中的“肉片”是程序的業務邏輯,在這裏只能處理字符串對象。在其他處理過程中,一定不能編碼或解碼。對輸出來說,則要盡量晚地把字符串編碼成字節序列。多數 Web 框架都是這樣做的,使用框架時很少接觸字節序列。例如,在 Django 中,視圖應該輸出 Unicode 字符串; Django 會負責把響應編碼成字節序列,而且默認使用 UTF-8 編碼。
內置的 open 函數會在讀取文件時做必要的解碼,以文本模式寫入文件時還會做必要的編碼,所以調用 my_file.read()方法得到的以及傳給 my_file.write(text) 方法的都是字符串對象。
但是有時候,不指定編碼可能會發生錯誤.

>>> open(‘cafe.txt‘, ‘w‘, encoding=‘utf_8‘).write(‘café‘)
4
>>> open(‘cafe.txt‘).read()  # 如果這裏的系統默認編碼不是utf-8,則會出現問題
‘caf??‘

文本和字節序列