第四章 字符編碼
1、存取文件不亂碼的法則:用什麽編碼存的,就要用什麽編碼讀
2、 decode encode
bytes------------->unicode---------->bytes
3、python3解釋器默認使用的字符編碼是utf-8
python2解釋器默認使用的字符編碼是ascii
4、python2的str就是python3的bytes
python2的unicode就是python3的str
總結字符編碼的發展可分為三個階段:
階段一:現代計算機起源於美國,最早誕生也是基於英文考慮的ASCII
ASCII:
階段二:為了滿足中文和英文,中國人定制了GBK
GBK:2Bytes代表一個中文字符,1Bytes表示一個英文字符;為了滿足其他國家,各個國家紛紛定制了自己的編碼,日本把日文編到Shift_JIS裏,韓國把韓文編到Euc-kr裏
階段三:各國有各國的標準,就會不可避免地出現沖突,結果就是,在多語言混合的文本中,顯示出來會有亂碼。
於是出現了unicode(定長), 統一用2Bytes代表一個字符, 雖然2**16-1=65535,但unicode卻可以存放100w+個字符,因為unicode存放了與其他編碼的映射關系,準確地說unicode並不是一種嚴格意義上的字符編碼表。很明顯對於通篇都是英文的文本來說,unicode的式無疑是多了一倍的存儲空間,於是產生了UTF-8
要想保證文件不亂碼,用什麽編碼存的就用什麽編碼取.
x=‘上‘
python2:啟動python解釋器,把文件從內存讀出(以默認ASCII碼), bytes=str
申請內存空間存儲字符串
#coding:gbk
print(‘上‘)
print([x])
內存空間存的值[‘\xc9\xcf‘] #(GBK),2個bytes,4個16進制數
print([x.decode(‘gbk‘)]) #以什麽編碼存的就用什麽編碼取
[u‘\u4e0a‘](unicode) #解碼
y=x.decode(‘gbk‘) #y是Unicode類型,可以轉化為任意類型
print([y.encode(‘utf-8‘)])
x=u‘上‘
print(type(x)) #python2 有直接的unicode的類型,可以encode其他編碼.建議都加u
unicode
打印編碼:pycharm的終端是utf8的編碼,要按照打印終端的編碼來顯示出來.
windows的終端是gbk的編碼
linux的終端是utf8的編碼
python3:啟動python解釋器,把文件從內存讀出(以默認UTF-8碼) #coding:gbk 告訴python解釋器以什麽編碼讀取存儲字符串
x=‘上‘
y=x.encode(‘gbk‘) #只能encode證明python3默認就是以unicode存.
print(y,type(y))
b‘\xc9\xcf‘ <class ‘bytes‘> #python3的bytes類型就是python2的str類型,所有的字符串編碼都是bytes類型
#文件編碼(存)默認就是utf-8類型,字符串編碼默認是unicode類型
第四章 字符編碼