49 字元編碼

2022-05-02 23:39:11 字數 3569 閱讀 3120

目錄六.總結

開啟編輯器就啟動了乙個程序,是在記憶體中的,所以,用編輯器編寫的內容,也都是存放在記憶體中的,斷電後資料丟失。

要想永久儲存,需要點選儲存按鈕:編輯器吧記憶體的資料刷到硬碟上。

在我們編寫的乙個py檔案,沒有執行前,和編寫其它檔案沒有任何區別,都只是在編寫一堆字元而已。

第三階段:python直譯器會解釋執行剛剛載入到記憶體中的test.py的**(ps:在該階段,即真正執行**時,才會識別python的語法,執行檔案內**,當執行到name='lwx'時,才會開闢記憶體空間去存放字串'lwx')

不通點:文字編輯器將檔案內容讀寫到記憶體後,是為了顯示或者編輯,根本不會例會python的語法,二python直譯器將檔案讀寫到記憶體中,是為了執行python**,會執行python語法

計算機要想工作必須通電,即用『電』驅使計算機幹活,也就是說『電』的特性決定了計算機的特性。電的特性即高低電平(人類從邏輯上將二進位制數1對應高電平,二進位制數0對應低電平),關於磁碟的磁特性也是同樣的道理。結論:計算機只認識數字。

很明顯,我們平時在使用計算機時,用的都是人類能讀懂的字元(用高階語言程式設計的結果也無非是在檔案內寫了一堆字元),如何能讓計算機讀懂人類的字元?

必須經過乙個過程:

總而言之,字元編碼就是講人類的字元編碼成計算機能識別的數字,這種轉換必須遵循一套固定的標準,該標準無非是人類字元與數字的對應關係,稱之為字元編碼。

乙個python檔案中的內容是由一堆字元組成的,訪問設計到字元碼問題(python檔案並未執行,前兩個階段均屬於該範疇)

python中的資料型別字串是由一串字元組成的(python檔案執行時,即第三階段)

計算機由美國人發明,最早的字元編碼為ascii,只規定了英文本母數字和一些特殊字元與數字的對應關係。最多只能用 8 位來表示(乙個位元組),即:2**8 = 256,所以,ascii碼最多只能表示 256 個符號。

當然我們程式語言都用英文沒問題,ascii夠用,但是在處理資料時,不同的國家有不同的語言,中國人會加入中文,日本人會在自己的程式中加入日文,南韓人也是。

但是要表示中文,單拿乙個位元組表表示乙個漢子,是不可能表達完的(連小學生都認識兩千多個漢字),解決方法只有乙個,就是乙個位元組用》8位2進製代表,位數越多,代表的變化就多,這樣,就可以盡可能多的表達出不通的漢字。

所以中國人規定了自己的標準gb2312編碼,規定了包含中文在內的字元與數字的對應關係。

日本人規定了自己的shift_jis編碼;南韓人規定了自己的euc-kr編碼(另外,南韓人說,計算機是他們發明的,要求世界統一用南韓編碼,但世界人民沒有搭理他們)

這時候問題出現了,精通18國語言的小周同學謙虛的用8國語言寫了一篇文件,那麼這篇文件,按照哪國的標準,都會出現亂碼(因為此刻的各種標準都只是規定了自己國家的文字在內的字元跟數字的對應關係,如果單純採用一種國家的編碼格式,那麼其餘國家語言的文字在解析時就會出現亂碼)。所以迫切需要乙個世界的標準(能包含全世界的語言)於是unicode應運而生(南韓人表示不服,然後沒有什麼卵用)。

ascii用1個位元組(8位二進位制)代表乙個字元;unicode常用2個位元組(16位二進位制)代表乙個字元,生僻字需要用4個位元組。

例:字母x,用ascii表示是十進位制的120,二進位制0111 1000。

漢字中已經超出了ascii編碼的範圍,用unicode編碼是十進位制的20013,二進位制的01001110 00101101。

字母x,用unicode表示二進位制0000 0000 0111 1000,所以unicode相容ascii,也相容萬國,是世界的標準。

這時候亂碼問題消失了,所有的文件我們都使用但是新問題出現了,如果我們的文件通篇都是英文,你用unicode會比ascii耗費多一倍的空間,在儲存和傳輸上十分的低效。

本著節約的精神,又出現了把unicode編碼轉化為「可變長編碼」的utf-8(unicode transformation format-8)編碼。utf-8編碼把乙個unicode字元根據不同的數字大小編碼成1-6個位元組,常用的英文本母被編碼成1個位元組,漢字通常是3個位元組,只有很生僻的字元才會被編碼成4-6個位元組。如果你要傳輸的文字包含大量英文本元,用utf-8編碼就能節省空間:

字元ascii

unicode

utf-8

a01000001

00000000 01000001

01000001中x

01001110 00101101

11100100 10111000 10101101

從上面的**還可以發現,utf-8編碼有乙個額外的好處,就是ascii編碼實際上可以被看成是utf-8編碼的一部分,所以,大量只支援ascii編碼的歷史遺留軟體可以在utf-8編碼下繼續工作。

說了那麼一大堆,那為什麼記憶體用unicode,而不直接使用utf-8呢?這樣不就可以直接把**從記憶體直接丟入硬碟了嗎?出現這個問題的原因是硬碟中還躺了其他國家的**,各個國家的**的二進位制還需要執行在計算機上使用,因此記憶體中必須使用unicode的編碼,因為unicode能和硬碟中其他國家的二進位制中的**進行轉換,但是utf-8只是簡化了**的儲存,它並不能與其他國家硬碟中的**進行關係轉換。總而言之只有unicode編碼才能執行其他國家硬碟中的**,而utf-8的**無法進行該操作。

記憶體中還使用unicode編碼,是因為歷史遺留問題造成的,但是因為現在寫**使用的都是utf-8**,所以以後記憶體中的**都將變成utf-8**,並且以前遺留的各個國家的**都將被淘汰,所以未來記憶體中使用的編碼也將使用utf-8編碼替代unicode編碼。

首先明確概念

亂碼的兩種情況:

存檔案時,由於檔案內有各個國家的文字,我們單以shiftjis去存,

本質上其他國家的文字由於在shiftjis中沒有找到對應關係而導致儲存失敗。但當我們硬要存的時候,編輯並不會報錯(難道你的編碼錯誤,編輯器這個軟體就跟著崩潰了嗎???),但毫無疑問,不能存而硬存,肯定是亂存了,即存檔案階段就已經發生亂碼,而當我們用shiftjis開啟檔案時,日文可以正常顯示,而中文則亂碼了。

存檔案時用utf-8編碼,保證相容萬國,不會亂碼,而讀檔案時選擇了錯誤的解碼方式,比如gbk,則在讀階段發生亂碼,讀階段發生亂碼是可以解決的,選對正確的解碼方式就ok了

保證不亂碼的核心法則就是,字元按照什麼標準而編碼的,就要按照什麼標準解碼,此處的標準指的就是字元編碼。

在記憶體中寫的所有字元,一視同仁,都是unicode編碼,比如我們開啟編輯器,輸入乙個「你」,我們並不能說「你」就是乙個漢字,此時它僅僅只是乙個符號,該符號可能很多國家都在使用,根據我們使用的輸入法不同這個字的樣式可能也不太一樣。只有在我們往硬碟儲存或者基於網路傳輸時,才能確定」你「到底是乙個漢字,還是乙個日本字,這就是unicode轉換成其他編碼格式的過程了。簡而言之,就是記憶體中固定使用的就是uncidoe編碼,我們唯一能改變的就是儲存到硬碟時使用的編碼。

01字元編碼

程式設計中經常用到字元編碼,常用字元編碼有ascii american standard code for information interchange 編碼 unicode編碼 unicode編碼又有utf 8形式和utf 16形式 ascii表如下 擴充套件ascii表如下 unicode是一...

07 字元編碼

1.字元編碼 字元編碼針對的是文字無需考慮 視屏 音訊 等 2.編寫文字的過程 輸入的字元 字元編碼表 二進位制數字 2.1字元編碼表 就是字元與數字的對應關係 a 0 b 1 a 00 b 01 c 11 d 10 2.2ascii碼表 用八位二進位制表示乙個英文本元 所有的英文本元 符號最多也就...

3 字元編碼

字元編碼 編者的話 從磁碟中讀取資料時,直接將存在檔案中的二進位制轉換成unicode的二進位制存到記憶體中,需指定乙個編碼如utf 8,前提是檔案在儲存時是以utf 8儲存的.系統中維護了一張關於utf 8到unicode的表,存檔案時,直接通過這張表將記憶體中unicode的二進位制翻譯成utf...