文本和字節序列
阿新 • • 發佈:2018-02-12
問題 負責 如果 解碼 默認 分享圖片 函數 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??‘
文本和字節序列