1. 程式人生 > >第四章 字符編碼

第四章 字符編碼

2個 明顯 更多 post pychar 16進制 滿足 就是 直接

1、存取文件不亂碼的法則:用什麽編碼存的,就要用什麽編碼讀

2、 decode encode

bytes------------->unicode---------->bytes

3、python3解釋器默認使用的字符編碼是utf-8

python2解釋器默認使用的字符編碼是ascii

4、python2的str就是python3的bytes

python2的unicode就是python3的str

總結字符編碼的發展可分為三個階段:

階段一:現代計算機起源於美國,最早誕生也是基於英文考慮的ASCII

ASCII

一個Bytes代表一個字符(英文字符/鍵盤上的所有其他字符),1Bytes=8bit,8bit可以表示0-2**8-1種變化,即可以表示256個字符

階段二:為了滿足中文和英文,中國人定制了GBK

GBK:2Bytes代表一個中文字符,1Bytes表示一個英文字符;為了滿足其他國家,各個國家紛紛定制了自己的編碼,日本把日文編到Shift_JIS裏,韓國把韓文編到Euc-kr裏

階段三:各國有各國的標準,就會不可避免地出現沖突,結果就是,在多語言混合的文本中,顯示出來會有亂碼。

於是出現了unicode(定長), 統一用2Bytes代表一個字符, 雖然2**16-1=65535,但unicode卻可以存放100w+個字符,因為unicode存放了與其他編碼的映射關系,準確地說unicode並不是一種嚴格意義上的字符編碼表。很明顯對於通篇都是英文的文本來說,unicode的式無疑是多了一倍的存儲空間,於是產生了UTF-8

(可變長,全稱Unicode Transformation Format),對英文字符只用1Bytes表示,對中文字符用3Bytes,對其他生僻字用更多的Bytes去存

要想保證文件不亂碼,用什麽編碼存的就用什麽編碼取.
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類型

第四章 字符編碼