文本和字節序列

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é'
相關文章
相關標籤/搜索