Python13 字元轉編碼
- 2020 年 1 月 7 日
- 筆記
編碼:
最開始電腦的字符集是ASCII,英文在ASCII中每個字母佔1個位元組,但ASCII不支援中文,所以後來出現了Unicode;
Unicode中 英文和中文都佔用兩個位元組,對於英文來說不合理,所以在Unicode的基礎上出現了Unicode的擴展集UTF8;
UTF8中,英文如同ASCII一樣,每個字母只佔了1個位元組,而每個中文佔了3個位元組;
目前中國Windows系統默認都是使用GBK字符集,如果一個軟體使用的是GBK來開發的話,放到其他國家的電腦系統中,軟體中的中文就會以亂碼顯示,因為其他國家電腦默認是不支援BGK的;
Unicode這個字符集所有國家電腦系統都支援,所以當想要把通過GBK開發的軟體的中文,能在其他國家電腦中正常你顯示就需要先將GBK轉成Unicode,然後其他國家電腦系統可以用Unicode轉成他們支援的字符集,反之亦然。

如圖:一個編碼想轉成另一個編碼,必須先decode成Unicode,然後在encode成其他編碼。
import sys print (sys.getdefaultencoding()) #列印系統默認編碼

在python3中,默認是utf-8(utf-8屬於unicode的擴展集)
python2編碼
import sys print (sys.getdefaultencoding())

在python2中,默認是ascii


在python2中,設置編碼為utf-8; 寫一個變數,這個變數會因為設置的原因,現在是utf-8 我們直接將這個變數(utf-8)進行轉碼到gbk,但是可以看到轉碼錯誤;正常轉碼之前,應該先解碼成Unicode,但是我們這裡沒有做解碼的操作,不過這裡會自動做一個解碼的操作,但這個自動解碼的操作使用的是系統默認的ascii來解碼,可我們的變數是utf-8,所以這裡報錯解碼失敗。

b = a.decode('utf-8') #這裡指定源編碼是utf-8,以utf-8為源編碼轉成unicode

這裡我們先做一個解碼操作,列印之後,我們可以看到列印type(b)可以正常顯示是unicode,而列印的b卻不正常,這是因為可以看到列印出來的是元組,unicode編碼在元組中不會顯示中文,只會以編碼形的格式顯示,在格式的前面有一個u,表示unicode;
print (b) #需要單獨列印b,才不會以元組的形式列印

c = b.encode('gbk') #將unicode轉成gbk print (c)

列印出來的是亂碼,這是當前pycharm調整了編碼模式為utf-8,所以列印gbk出來時是亂碼

把pycharm改成GBK咋列印gbk就不是亂碼了

c = b.encode('gbk') #從unicode轉成gbk

已經看到列印gbk不是亂碼了,同時列印b(unicode)也同樣不是亂碼,這是因為unicode可以兼容所有編碼,所以不會是亂碼,如果這裡是assic就會是亂碼了
f = c.decode('gbk').encode('utf-8') #將當前的gbk解碼為unicode,然後在編碼為utf-8 print (f)

列印出來是亂碼


可以看到最後列印utf-8的已經不是亂碼了; 不過在之上的gbk就成亂碼了。
x = u'一二三' #在'一二三'前面有個u,表示直接轉碼為unicode print (x)

可以看到unicode在utf-8編碼下也能正常顯示。 y = x.encode('gbk') #unicode編碼可以直接encode為其他編碼 print (y)
python3編碼
import sys print (sys.getdefaultencoding()) #python3默認就屬於unicode,utf-8屬於unicode的擴展集,所以也算是unicode a = '哈嘍' print (a.encode('gbk')) #unicode可以直接轉成其他編碼

轉成編碼後因為當前pycharm是unicode,所以沒有正常顯示。 前面有個b,表示被轉成bytes類型

在pycharm的右下角可以直接轉換編碼為gbk,這裡只是將文件編碼轉為gbk和程式的編碼無關

再去執行的時候,發現報錯,這是因為之前寫程式碼的時候默認是unicode,現在已經轉換成gbk了,但是程式碼還是根據默認unicode來寫的;

所以要在文件開頭進行聲明,文件編碼是gbk,注意這裡只是聲明文件編碼是gbk和程式編碼無關; 目前python3程式默認還是unicode

目前a = '哈嘍'還是屬於unicode(因為python3默認是unicode)

可以看到因為當前a屬於unicode,所以不能做decode操作(圖中沒有decode可選)

從unicode轉成gbk

當前是bytes類型的數據,所以無法顯示字元串


注意在python3中,encode後不光轉了編碼,還將數據編程bytes類型


decode一下就可以顯示中文字元串了。
windows默認是gbk linux默認是utf-8 python2默認是ascii python3默認是unicode
最終要記住的就是,無論在python2還是在python3上,要做的是確認當前使用的編碼集,任何非unicode編碼集都要decode成unicode,然後通過unicode在encode成想要的編碼集;
如果當前直接就是unicode,可以直接encode想要的編碼集。
在python3上默認是unicode,中文和英文都按照兩個位元組存儲,通過聲明 –– coding:utf -8-– ,編碼就為utf-8了,這樣英文存儲為1個位元組,中文為3個位元組。