python基礎---字元編碼
一、了解字元編碼
1. 文字編輯器訪問檔案的原理(nodepad++,pycharm,word)
開啟編輯器就開啟了啟動了乙個程序,是在記憶體中的,所以在編輯器編寫的內容也都是存放與記憶體中的,斷電後資料丟失
因而需要儲存到硬碟上,點選儲存按鈕,就從記憶體中把資料刷到了硬碟上。
在這一點上,我們編寫乙個py檔案(沒有執行),跟編寫其他檔案沒有任何區別,都只是在編寫一堆字元而已。
2. python直譯器執行py檔案的原理 ,例如python test.py
第二階段:python直譯器相當於文字編輯器,去開啟test.py檔案,從硬碟上將test.py的檔案內容讀入到記憶體中
第三階段:python直譯器解釋執行剛剛載入到記憶體中test.py的**
總結:python直譯器是解釋執行檔案內容的,因而python直譯器具備讀py檔案的功能,這一點與文字編輯器一樣。
與文字編輯器不一樣的地方在於,python直譯器不僅可以讀檔案內容,還可以執行檔案內容。
二、字元編碼的發展史
1、字元翻譯成數字的過程就是乙個字元如何對應乙個特定數字的標準,這個標準稱之為字元編碼
2、階段一:現代計算機起源於美國,最早誕生也是基於英文考慮的ascii(其範圍之適用於英文)
ascii:乙個bytes代表乙個字元(英文本元/鍵盤上的所有其他字元),1bytes=8bit,8bit可以表示0-2**8-1種變化,即可以表示256個字元。ascii最初只用了後七位,127個數字,已經完全能夠代表鍵盤上所有的字元了(英文本元/鍵盤的所有其他字元),後來為了將拉丁文也編碼進了ascii表,將最高位也占用了
3、階段二:為了滿足中文,中國人定製了gbk (gbk:2bytes代表乙個字元)。
日本把日文編到shift_jis
裡,南韓把韓文編到euc-kr
裡。
4、階段三:各國有各國的標準,就會不可避免地出現衝突,結果就是,在多語言混合的文字中,顯示出來會有亂碼。於是產生了unicode,統一用2bytes代表乙個字 符,2**16-1=65535,可代表6萬多個字元,因而相容萬國語言,但對於通篇都是英文的文字來說,這種編碼方式無疑是多了一倍的儲存空間(二進位制最終都是以電或者 磁的方式儲存到儲存介質中的)於是產生了utf-8,對英文本元只用1bytes表示,對中文字元用3bytes。
補充:記憶體中使用的編碼是unicode,用空間換時間(程式都需要載入到記憶體才能執行,因而記憶體應該是盡可能的保證快)
硬碟中或者網路傳輸用utf-8,網路i/o延遲或磁碟i/o延遲要遠大與utf-8的轉換延遲,而且i/o應該是盡可能地節省頻寬,保證資料傳輸的穩定性
三、字元編碼的使用
1、亂碼產生的原因
檔案從記憶體刷到硬碟的操作簡稱存檔案,檔案從硬碟讀到記憶體的操作簡稱讀檔案。
亂碼一:存檔案時就已經亂碼
存檔案時,由於檔案內有各個國家的文字,我們單以shiftjis去存,本質上其他國家的文字由於在shiftjis中沒有找到對應關係而導致儲存失敗,用open函式的write可以測試,f=open('a.txt','w',encodig='shift_jis'),f.write('你瞅啥\n何を見て\n') #'你瞅啥'因為在shiftjis中沒有找到對應關係而無法儲存成功,只存'何を見て\n'可以成功,但當我們用檔案編輯器去存的時候,編輯器會幫我們做轉換,保證中文也能用shiftjis儲存(硬存,必然亂碼),這就導致了,存檔案階段就已經發生亂碼,此時當我們用shiftjis開啟檔案時,日文可以正常顯示,而中文則亂碼了。
亂碼二:存檔案時不亂碼而讀檔案時亂碼
存檔案時用utf-8編碼,保證相容萬國,不會亂碼,而讀檔案時選擇了錯誤的解碼方式,比如gbk,則在讀階段發生亂碼,讀階段發生亂碼是可以解決的,選對正確的解碼方式就ok了,而存檔案時亂碼,則是一種資料的損壞。
2、解決辦法:
核心法則就是,檔案以什麼編碼儲存的,就以什麼編碼方式開啟
四、分析python程式的執行過程
1、過程
階段一:啟動python直譯器
階段二:python直譯器此時就是乙個文字編輯器,負責開啟檔案test.py,即從硬碟中讀取test.py的內容到記憶體中。此時,python直譯器會讀取test.py的第一行內 容,#coding:utf-8,來決定以什麼編碼格式來讀入記憶體,這一行就是來設定python直譯器這個軟體的編碼使用的編碼格式是這個編碼。可以用sys.getdefaultencoding()查 看,如果不在python檔案指定頭資訊#-*-coding:utf-8-*-,那就使用預設的python2中預設使用ascii,python3中預設使用utf-8
階段三:讀取已經載入到記憶體的**(unicode編碼的二進位制),然後執行,執行過程中可能會開闢新的記憶體空間,比如x="egon"
注釋:記憶體的編碼使用unicode,不代表記憶體中全都是unicode編碼的二進位制,在程式執行之前,記憶體中確實都是unicode編碼的二進位制,比如從檔案中讀取了一行x="egon",其中的x,等號,引號,地位都一樣,都是普通字元而已,都是以unicode編碼的二進位制形式存放與記憶體中的,但是程式在執行過程中,會申請記憶體(與程式**所存在的記憶體是倆個空間),可以存放任意編碼格式的資料,比如x="egon",會被python直譯器識別為字串,會申請記憶體空間來存放"egon",然後讓x指向該記憶體位址,此時新申請的該記憶體位址儲存也是unicode編碼的egon,如果**換成x="egon".encode('utf-8'),那麼新申請的記憶體空間裡存放的就是utf-8編碼的字串egon了.
五、python2與python3的區別
1、在python2中有兩種字串型別str和unicode
str型別:當python直譯器執行到產生字串的**時(例如s='林'),會申請新的記憶體位址,然後將'林'encode轉移成檔案開頭指定的編碼格式,這已經是encode之後的結果了,所以s只能decode
unicode型別:當python直譯器執行到產生字串的**時(例如s=u'林'),會申請新的記憶體位址,然後將'林'以unicode的格式存放到新的記憶體空間中,所以s只能encode,不能decode
2、 在python三種也有兩種字串型別str和bytes
python基礎 8 字元編碼
1 ascii ascii american standard code for information interchange,美國標準資訊交換 是基於拉丁字母的一套電腦編碼系統,主要用於顯示現代英語和其他西歐語言,其最多只能用 8 位來表示 乙個位元組 即 2 8 256 1,所以,ascii碼...
python基礎12 字元編碼
字元編碼 字符集和字元編碼一般都是成對出現的,如ascii ios 8859 1 gb2312 gbk,都是即表示了字符集又表示了對應的字元編碼。unicode比較特殊,有多種字元編碼 utf 8,utf 16等 ascii american standard code for informatio...
Python基礎4 字串
python字串是由數字 字母 下劃線組成的一串字元,我們可以使用引號來建立字串。如 str helloworld 在python中沒有char型別,單個字元也作為string使用 python的字串列表有2種取值順序 a.自左向右,預設索引從0開始,索引長度最長為字串長度 1 b.自右向左,預設索...