ascii
ascii碼是西歐編碼的方式,採取7位編碼,所以是2^7=128,共可以表示128個字元,包括34個字元,(如換行lf,回車cr等),其餘94位為英文本母和標點符號及運算符號等。
gb2321
gb2312 是對 ascii 的中文擴充套件。相容ascii。編碼規定:編碼小於127的字元與ascii編碼相同,特性:兩個大於127的字元連在一起時,就表示乙個漢字,前面的乙個位元組(稱之為高位元組)從0xa1用到0xf7,後面乙個位元組(低位元組)從0xa1到0xfe,這樣我們就可以組合出大約7000多個簡體漢字了。占用位元組:英文 1位元組 8bit中文 2位元組 16bit
gbk
gbk 相容ascll 相容 gb2312 是gb2312的擴充套件,但是中國的漢字太多了,我們很快就就發現有許多人的人名沒有辦法在這裡打出來,不得不繼續把 gb2312 沒有用到的碼位找出來用上。後來還是不夠用,於是乾脆不再要求低位元組一定是127號之後的內碼,只要第乙個位元組是大於127就固定表示這是乙個漢字的開始,不管後面跟的是不是擴充套件字符集裡的內容。結果擴充套件之後的編碼方案被稱為 「gbk」 標準,gbk 包括了 gb2312 的所有內容,同時又增加了近20000個新的漢字(包括繁體字)和符號。
unicode
unicode是國際組織制定的可以容納世界上所有文字和符號的字元編碼方案。
目前的unicode字元分為17組編排,0x0000至0x10ffff,每組稱為平面(plane),而每平面擁有65536個碼位,共1114112個。然而目前只用了少數平面。utf-8、utf-16、utf-32都是將數字轉換到程式資料的編碼方案。
utf-8
utf-8以位元組為單位對unicode進行編碼。從unicode到utf-8的編碼方式如下:utf-8的特點是對不同範圍的字元使用不同長度的編碼。對於0x00-0x7f之間的字元,utf-8編碼與ascii編碼完全相同。utf-8編碼的最大長度是6個位元組。從上表可以看出,6位元組模板有31個x,即可以容納31位二進位制數字。unicode的最大碼位0x7fffffff也只有31位。
字串通過編碼轉換成位元組碼,
encode:str --> bytes
位元組碼通過解碼成為字串
decode:bytes --> str
str = "測試"
str_utf8 = str.encode('utf-8')
str_gbk = str.encode('gbk')
print(str)
print("utf-8 編碼:", str_utf8)
print("gbk 編碼:",str_gbk)
print("utf-8 解碼:", str_utf8.decode('utf-8'))
print("gbk解碼:",str_gbk.decode('gbk'))
輸出結果:
測試utf-8 編碼: b'\xe6\xb5\x8b\xe8\xaf\x95'
gbk 編碼: b'\xb2\xe2\xca\xd4'
utf-8 解碼: 測試
gbk解碼: 測試
錯誤:unicodedecodeerror: 'utf-8' codec can't decode byte 0xd6 in position 0: invalid continuation byte
原因:當讀取的檔案是gbk/utf-8等編碼格式,遇到這兩種情況會報上面這個錯誤:1)python程式沒有指定編碼方式,取作業系統的編碼方式,但作業系統編碼方式與要讀取的編碼方式不一致;2)python程式在讀取指定的檔案時,程式指定的編碼方式與檔案的編碼方式不一致;
解決方法:有兩種解決方案,第二種是二進位制處理,有優勢:1)檔案讀取時指定與檔案一致的編碼方式;2)通過二進位制讀取檔案,二進位制寫入檔案,但在程式中用字串時,需要做下編碼和解碼;
# -*- coding: utf-8 -*-
import os
#二進位制讀取,對於複製檔案有優勢;但是程式使用時需要通過編碼、解碼
lines = f_r.readlines()
for line in lines:
print(line.decode('gbk'))
for line in lines:
f_w.write(line)
#指定檔案讀取方式,此時要知道檔案的編碼方式
lines2 = f_r2.readlines()
for line in lines2:
print(line)
f_w2.writelines(line)
python 編碼解碼
一種編碼想要轉成另一種編碼,需要先解碼成萬國碼 unicode,然後再從unicode轉成其他編碼。例如gbk格式想要轉成utf 8,需要先按照 gbk 的格式 decode 成 unicode,再從 unicode 格式 encode 成utf 8 python3預設使用utf 8編碼,故不用宣告...
編碼 解碼 python
之前一直對python檔案中編碼解碼糊里糊塗,今天看到一篇文章,覺得把我講的有點明白了。寫個心得吧。1 編碼解碼是怎麼一回事?python 裡面的編碼和解碼也就是 unicode 和 str 這兩種形式的相互轉化。編碼是 unicode str,相反的,解碼就是 str unicode。str形式,...
python檔案讀寫與編碼解碼
最近接觸到python的檔案讀寫與編碼解碼,非常頭疼,下面寫一下最近的思考 目的為 分析在ide中將中文字串以預設編碼寫入txt檔案,在windows系統下修改txt檔案的編碼,在ide中重新開啟此txt出現錯誤的原因 ide的預設編碼是utf 8 系統的預設編碼是ansi 對於以下 str 奧森山...