字元是相對於人類而言的可識別的符號標識,是一種人類語言,如中文、英文、拉丁文甚至甲骨文、梵語等等。
位元組是計算機內部識別可用的符號標識(0和1組成的二進位制串,機器語言),屬於機器語言。
人與計算機互動就需要在人類語言和機器語言之間來回轉換,因此當把各種各樣的字元儲存或輸入到計算機時,最終都必須以位元組形式來表示;反之當計算機輸出相應資訊給人類使用者時,最終也需要以人類可識別的字元形式來傳遞。
乙個python應用程式的執行三個步驟
1、先啟動直譯器
2、直譯器會傳送系統呼叫。把檔案內容從硬碟讀入記憶體,此時檔案中的內容全部為普通字元,沒有任何語法意義。
3、直譯器開始執行剛剛讀入六成的檔案**開始識別python的語法。
文字編輯器讀取python檔案的三個步驟
1、啟動文字編輯器
2、文字編輯器會傳送系統呼叫,檔案的內容從硬碟讀取入記憶體。
3、文字編輯器會佔剛剛讀入記憶體的內容輸出在螢幕上
總結:兩者的前兩個步驟完全一致,但是不同的是第三階段文字編輯器不能識別python的語法只是顯示出來。
計算機只能識別二進位制,我們平時寫的**都需要轉成二進位制才能被計算機識別。所以,我們寫的字元怎麼轉換成二進位制呢,這個過程實際就是通過乙個標準使我們寫的字元與特定數字一一對應,這個標準就稱為字元編碼。
字元------翻譯------->數字
計算機起源於美國,字元編碼也起源於美國。但是美國人民使用的文字只有26個字母,再加上些特殊符號就搞定了。所以美國人民就使用了ascii碼(美國資訊交換標準碼)作為字元編碼,乙個bytes代表乙個字元,1bytes=8bit,可以有2的8次方即256中不同的變化。
在2023年,國家標準總局發布了中文使用的字元編碼-->gbk,使用兩個位元組表示乙個漢字。
其他國家也分別發布了自己國家的字元編碼標準,如日本的shift_jis,南韓的euc-kr等等
3.unicode
2023年,國際標準化組織發布了號稱萬國碼的unicode,用兩個位元組表示乙個字元,有65536種組合,已經能把全世界絕大多數語言包括了。
4.utf-8
unicode雖然好,但有乙個問題,本來用乙個位元組就能表示的英文,現在要用兩個位元組,儲存空間平白多出一倍,這顯然是不完美的,所以又產生了utf-8,對英文本元只用1個位元組,對中文字元用3個位元組來表示。
5. unicode所有字元都是兩個位元組,簡單粗暴,字元轉換成數字的速度快,但是占用儲存空間大
utf-8對不同的字元採用不用的長度表示,節省空間,但是轉換效率不如unicode快
記憶體中使用的字元編碼是unicode,記憶體就是為了加快速度的,所以寧肯犧牲一點空間,也要保證速度
硬碟和網路傳輸是用utf-8的,因為磁碟i/o或者網路i/o延遲要遠大於utf-8的轉換效率,並且在網路傳輸中應該盡可能節省頻寬
三、python直譯器執行
第三階段:python直譯器解釋執行剛剛載入到記憶體中t.py的**
其中第二階段,t.py檔案在儲存時有乙個字元編碼,在python直譯器開啟檔案時也要指定一樣的編碼方式(python2預設的編碼方式是ascii,python3預設是utf-8),如果檔案儲存的編碼格式和python直譯器預設的編碼方式不一樣,就要在檔案的開頭寫上#coding: ,來告訴python直譯器不要用自己預設的編碼方式來讀,而是要用標頭檔案指定的方式來讀檔案,這樣才不會出錯。
第三階段:讀取已經載入到記憶體中的**(預設是unicode),然後執行,執行過程中如果碰到類似定義變數的操作,就會在記憶體中開闢一塊新的記憶體空間。此時注意,新開闢的記憶體空間不一定也是unicode,使用者可以在定義變數的時候指定編碼方式,定義時開闢的記憶體空間,也只是一塊空間而已,可以存放任意編碼格式的**。以python3為例
四、編碼解碼
儲存檔案是把記憶體中的檔案儲存到硬碟上
讀檔案是把硬碟中的檔案讀到記憶體
unicode是父編碼,utf-8,gbk這些是子編碼,如果子碼想轉換成其他編碼,必須要先轉換成父編碼,再由父編碼轉換成其他子編碼
解碼就是decode,是由子碼轉成父碼unicode的過程
編碼就是encode,是由unicode轉換成其他編碼的過程
之前說過,檔案讀入記憶體中,就成了unicode編碼(當然這是預設情況,也可以根據指令更改),從硬碟讀檔案的過程就是把硬碟中的utf-8解碼成unicode
檔案儲存時,就是由記憶體儲存到硬碟的過程,硬碟中是utf-8的編碼方式,需要由unicode編碼成utf-8
五、python2和python3的區別
1.python2的預設編碼方式是ascii,開啟utf-8儲存的檔案時會報錯,應該在標頭檔案上加#coding : utf-8
python2中有兩種字串型別,str和unicode,str可以通過在前面加個『u』來轉換成unicode
2.python 3 目前比較完美,基本上沒啥問題。
mysql 更改編碼
1.建立庫時指定編碼 create database testdb default charset gbk 2.修改庫的編碼 alter database testtable default character set utf8 collate utf8 bin 3.修改表的編碼 alter tab...
python2 7更改編碼型別 根據系統替換分隔符
1 在系統預設編碼為ascii的系統中,儲存中文到檔案是亂碼 unicodedecodeerror ascii codec can t decode byte 0xe7 in position 7 ordinal not in range 128 2 在window和linux檔案路徑分隔符不相同,...
oracle儲存過程 更改字段型別
一 問題說明 在專案開發過程中,有時需要將多張表做union操作,會發現由於個別表的字段不一致,造成union語句查詢報錯。這時有以下的解決方法 1.較為簡單 將少量的不一致字段,使用to number to date等方式作下處理。這樣能夠確保查詢操作正常 2.較為複雜 更改少量不一致欄位的字段型...