python編碼

瞭解python編碼python

資料來源:linux

https://www.tr0y.wang/2018/09/13/py-coding-type/windows

 

各字符編碼功能介紹 python3.x

ASCII碼主要是爲了處理英文字符編輯器

GB2312主要是處理中文字符性能

unicode主要是爲了處理各國字符編碼

UTF-8提升了unicode存儲和傳輸性能,它是unicode的一種表現形式spa

 

創造str和unicodeunix

 直接創造str和unicodecode

 

 

 

str => unicode,unicode => str

python提供了 decode/encode 用於二者的轉換

    1)str -> decode('某種編碼') -> unicode

    2)  unicode -> encode('某種編碼') -> str

  總結:unicode通過編碼後造成str,str編碼後造成unicode

  注:unicode是一種字符集,不屬於編碼,其它編碼是具體實現unicode思想的一種編碼,因此str到unicode的轉換稱爲解碼,而unicode到str的轉換稱爲編碼

 

環境編碼

系統默認編碼   1)linux,unix:utf-8     2)windows:gbk2312

 

編輯器編碼

能夠自由設置,最好統一爲UTF-8

 

文件頭部編碼聲明

聲明編碼方式爲:# -*- coding: utf-8 -*- 或 #coding=utf-8(今天才知,-*-僅僅是爲了好看),utf-八、utf8,python都能識別

注:聲明放在第一行,代碼中直接聲明的字符串編碼類型,與頭部聲明編碼方式直接相關,爲避免亂碼和後續處理,建議統一爲utf-8

 

編碼之間的轉換

須要用unicode搭橋。str有各類編碼的區別,unicode是沒有編碼的標準形式

 

 python2.x和python3.x的編碼方式

  python2.x默認使用ascii編碼,python3.x默認使用utf-8編碼,

  python2中,str編碼後的結果是bytes,str = bytes, 因此s只能decode

  python3.x的編碼方式是:

          文本老是 Unicode,由 str 類型表示,二進制數據則由 bytes 類型表示。Python 3 不會以任意隱式的方式混用 str 和 bytes

   解釋:首先,Unicode 是內存編碼表示方案(是規範),而 UTF 是如何保存和傳輸 Unicode 的方案(是實現)。 這也是 UTF 與 Unicode 的區別。py3.X 中只有一種能保存文本信息的數據類型:str,不可變,保存的是 Unicode 碼位。Unicode 是離用戶更近的數據,bytes 是離計算機更近的數據

   變化: str 表示的概念都是字符串類型,只不過 Py2.x 的 str 是通過編碼的 unicode,而 py3.x 的 str 就是 unicode。 那麼,py3.x 的 unicode 通過編碼後,是什麼呢?就是 bytes。也就是說,py3.x 的字符串默認是 unicode,至於你想把它怎麼編碼(utf8 或者 gbk),都是你本身的事。

#python2.x                                 #python3.x

字符串:str類型                              字符串:unicode 類型
type("123") :str                           type("123"): str
len(""):3                                len("我"):1
len("".decode("utf-8")) : 1               len("我".encode()) : 3

  

python3.x編碼示例

a = "" # a 是一個 字符串,類型是 str,用 unicode 表達
print(a) # '我'
a = b'\xe6\x88\x91' # a 是一個 字節流,類型是 bytes,用 utf8 編碼的 unicode 表達 print(a) # b'\xe6\x88\x91' a = "".encode("utf8") # 將 a 編碼,轉爲用 utf8 編碼的 unicode 表達 print(a) # b'\xe6\x88\x91' a = b'\xe6\x88\x91'.decode("utf8") # 將 a 解碼,轉爲用 unicode 表達 print(a) # "我" a = "".decode("utf8") # 試圖將 unicode 解碼 # 報錯:AttributeError: 'str' object has no attribute 'decode' a = b'\xe6\x88\x91'.encode("utf8") # 試圖將 bytes 編碼 # 報錯:AttributeError: 'bytes' object has no attribute 'encode' a = b'\xe6\x88\x91'.decode("gbk") # 解碼的編碼類型與原有編碼類型不匹配 # 報錯:UnicodeDecodeError: 'gbk' codec can't decode byte 0x91 in position 2: incomplete multibyte sequence
相關文章
相關標籤/搜索