編碼與解碼首先,明確一點,計算機中存儲的信息都是二進制的 編碼/解碼本質(zhì)上是一種映射(對應關(guān)系),,比如'a’用ascii編碼則是65,,計算機中存儲的就是00110101,但是顯示的時候不能顯示00110101,,還是要顯示'a',,但計算機怎么知道00110101是'a'呢,這就需要解碼,,當選擇用ascii解碼時,,當計算機讀到00110101時就到對應的ascii表里一查發(fā)現(xiàn)是'a',,就顯示為'a' 編碼:真實字符與二進制串的對應關(guān)系,,真實字符→二進制串 解碼:二進制串與真實字符的對應關(guān)系,二進制串→真實字符 ASCII & UTF-8大家熟知的ASCII以1字節(jié)8個bit位表示一個字符,,首位全是0,,表示的字符集明顯不夠 unicode編碼系統(tǒng)是為表達任意語言而設(shè)計的,為了防止存儲上的冗余(比如,,對應ascii碼的部分),,其采用了變長編碼,但變長編碼給解碼帶來了困難,,無法判斷是幾個字節(jié)表示一個字符 UTF-8是針對unicode變長編碼設(shè)計的一種前綴嗎,,根據(jù)前綴可判斷是幾個字節(jié)表示一個字符 如果一個字節(jié)的第一位是0,則這個字節(jié)單獨就是一個字符,;如果第一位是1,,則連續(xù)有多少個1,就表示當前字符占用多少個字節(jié),。 比如"嚴"的unicode是4E25(100111000100101),,4E25處在第三行的范圍內(nèi)(0000 0800-0000 FFFF),因此"嚴"的UTF-8編碼需要三個字節(jié),,即格式是"1110xxxx 10xxxxxx 10xxxxxx",。然后,從"嚴"的最后一個二進制位開始,,依次從后向前填入格式中的x,,高位補0,得到"嚴"的UTF-8編碼是"11100100 10111000 10100101",。 python中的解碼和編碼在python中,,編碼解碼其實是不同編碼系統(tǒng)間的轉(zhuǎn)換,默認情況下,,轉(zhuǎn)換目標是Unicode,,即編碼unicode→str,解碼str→unicode,,其中str指的是字節(jié)流 而str.decode是將字節(jié)流str按給定的解碼方式解碼,,并轉(zhuǎn)換成utf-8形式,u.encode是將unicode類按給定的編碼方式轉(zhuǎn)換成字節(jié)流str 注意調(diào)用encode方法的是unicode對象生成的是字節(jié)流,調(diào)用decode方法的是str對象(字節(jié)流)生成的是unicode對象,,若str對象調(diào)用encode會默認先按系統(tǒng)默認編碼方式decode成unicode對象再encode,,忽視了中間默認的decode往往導致報錯 自己寫代碼時只需記住str字節(jié)流調(diào)用decode,unicode對象調(diào)用
第一行定義了一個unicode對象(不是utf8) 第二行會輸出u'\u4e25' 第三行輸出<type 'unicode'> 嚴
倘若這時我用s.encode('utf8'),,則將s使用utf-8編碼并將編碼結(jié)果保存為字節(jié)流 第二行輸出'\xe4\xb8\xa5' 第三行輸出<type 'str'> 涓 還有要注意的是,,終端默認的編碼格式是gbk,windows cmd中可以通過chcp查看以及改變,,也可以到注冊表修改終端默認編碼(HKEY_CURRENT_USER console或者powershell下的codepage),,936為簡體中文,65001為utf8,,兩者都可顯示中文,,但為了方便中文輸入,我將其默認設(shè)為936 當調(diào)用print函數(shù)將內(nèi)容格式化輸出到終端時,,會將unicode對象轉(zhuǎn)換為終端的編碼方式輸出,,如上面第一次print的結(jié)果是正常的,print utf8字節(jié)流時,,終端按其默認gbk解碼顯示時就會出問題,,這里恰巧'\xe4\xb8'為gbk下的“涓”
文件的編碼格式保存文本時也有編碼格式,比如txt文件保存可選擇則ASCII,、utf8等,,對py文件可在前兩行注明編碼方式# -*- coding: UTF-8 -*- 在python中讀取文件
只要記住fstr是字節(jié)流,其他的操作參看上面即可 注:以上操作均在cmd或powershell下完成,,在python自帶的解釋器下會有問題,,s=u'你好',然后s,,顯示的雖然是unicode對象,,但是編碼卻是gbk的而不是unicode 參考 |
|