Python8_關於編碼解碼和utf-8


關於編碼:
ASCII碼是早期的編碼規范,只能表示128個字符。7位二進制數表示

擴展ASCII碼,由於ASCII碼不夠用,ASCII表擴充到256個符號,不同的國家有不同的標准;8位二進制數

Unicode 准確來說不是編碼格式,而是字符集。這個字符集包含了世界上所有的符號
所有字符長度統一用16位表示,因此字符是定長的;

GB2312 在ASCII碼表的基礎上,小於127的字符意義與原來相同,而將大於127的字節連在一起,表示漢字
前一個字節從0xA1(161)到0xF7(247)共87個,稱為高字節,后一個字節從0xA1(161)到0xFE(254)共94字節,稱為低字節。
兩者可組合處8000種組合。可以用來表示6763個簡體漢字、數學符號、羅馬字母,日文等;
127以下的稱為半角字符,兩個字節的編碼稱為全角字符;
簡單而言,GB2312就是在ASCII基礎上的簡體漢字擴展;

GBK 是對GB2312的擴展,完全兼容GB2312,達到了21886個漢字和符號

GB18030 收錄了70244個漢字和字符,更加全面,與GB2312-1980和GBK相兼容

UTF 有兩個格式UTF-8 UTF-16,表示每次傳輸8個位還是16個位,UTF-8等編碼體積比較大,占電腦空間多

======================================================

encode和decode:

編碼(動詞):按照某種規則(這個規則稱為:編碼(名詞))將“文本”轉換為“字節流”。而在python 3中則表示:unicode變成str

解碼(動詞):將“字節流”按照某種規則轉換成“文本”。而在python3中則表示:str變成unicode

 


bytes主要是給計算機看的,string主要是給人看的
中間有個橋梁是編碼規則,主要的趨勢是utf8
bytes對象是二進制的,很容易轉換成十六進制
string就是我們看到的內容,如'abc'


string經過編碼encode,轉換成二進制對象,給計算機識別,
bytes經過反編碼decode,轉化成string,給我們看。

python3中的str類型對象有點像Python2中的unicode
python3中的str是未編碼的,str有一個encode方法,調用這個方法之后將產生一個編碼后的byte類型字符串
byte類型字符串才支持decode。


str encode bytes
bytes decode str

記住python3中有兩個類型:字符串類型(Unicode字符)、bytes類型

=======================================================

Python中編碼、解碼與Unicode的聯系:
字符串在Python內部的表示是Unicode編碼,因此,在做編碼轉換時,通常需要以Unicode作為中間編碼,即先將其他編碼的字符串解碼(decode)成Unicode,再從Unicode編碼(encode)成另一種編碼。

在新版本的python3中,取消了unicode類型,代替它的是使用unicode字符的字符串類型(str),字符串類型(str)成為基礎類型如下所示,而編碼后的變為了字節類型(bytes)但是兩個函數的使用方法不變:

        decode                  encode
bytes ------> str(unicode)------>bytes

例子:
u = '中文' #指定字符串類型對象u
str = u.encode('gb2312') #以gb2312編碼對u進行編碼,獲得bytes類型對象str
u1 = str.decode('gb2312')#以gb2312編碼對字符串str進行解碼,獲得字符串類型對象u1
u2 = str.decode('utf-8')#如果以utf-8的編碼對str進行解碼得到的結果,將無法還原原來的字符串內容


文件讀取問題:
假如我們讀取一個文件,文件保存時,使用的編碼格式,決定了我們從文件讀取的內容的編碼格式,例如,我們從記事本新建一個文本文件test.txt, 編輯內容,保存的時候注意,編碼格式是可以選擇的,例如我們可以選擇gb2312,那么使用python讀取文件內容,方式如下:

f = open('test.txt','r')
s = f.read() #讀取文件內容,如果是不識別的encoding格式(識別的encoding類型跟使用的系統有關),這里將讀取失敗

'''假設文件保存時以gb2312編碼保存'''
u = s.decode('gb2312') #以文件保存格式對內容進行解碼,獲得unicode字符串

'''下面我們就可以對內容進行各種編碼的轉換了'''
str = u.encode('utf-8')#轉換為utf-8編碼的字符串str
str1 = u.encode('gbk')#轉換為gbk編碼的字符串str1
str1 = u.encode('utf-16')#轉換為utf-16編碼的字符串str1


codecs進行文件的讀取
python給我們提供了一個包codecs進行文件的讀取,這個包中的open()函數可以指定編碼的類型:

import codecs
f = codecs.open('text.text','r+',encoding='utf-8')  #必須事先知道文件的編碼格式,這里文件編碼是使用的utf-8
content = f.read()                                                #如果open時使用的encoding和文件本身的encoding不一致的話,那么這里將將會產生錯誤
f.write('你想要寫入的信息')
f.close()
=====================================================
在python2中,python2的默認編碼是ASCII碼,在做編碼轉換時,通常需要以unicode作為中間編碼,所以在python2中先將其他編碼的字符串解碼(decode)成unicode,再從unicode編碼(encode)成另一種編碼

通常使用如下

str.decode('utf-8').encode('utf-8')


但是在python3中, 字符串的默認編碼就是unicode,所以不需要解碼,直接就可以編碼成另一種編碼

通常使用如下

str.encode('utf-8')
總之,python3中,decode是將其他編碼解碼成unicode編碼,encode是將unicode編碼成其他編碼

也就是說只要事先知道某文件的編碼格式,用該編碼格式打開該文件,則讀取出來的字符串都是unicode編碼(python讀文件時自動將其他編碼格式->unicode編碼)。

=====================================================

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM