字符編碼
目錄html
計算機基礎(掌握)
文本編輯器存取文件的原理(熟悉)
- 打開編輯器就打開了啓動了一個進程,是在內存中的,因此,用編輯器編寫的內容也都是存放與內存中的,斷電後數據丟失。
- 要想永久保存,須要點擊保存按鈕:編輯器把內存的數據刷到了硬盤上。
- 在咱們編寫一個py文件(沒有執行),跟編寫其餘文件沒有任何區別,都只是在編寫一堆字符而已。
Python解釋器執行py文件的原理(熟悉)
- 第一階段:Python解釋器啓動,此時就至關於啓動了一個文本編輯器
- 第二階段:Python解釋器至關於文本編輯器,去打開test.py文件,從硬盤上將test.py的文件內容讀入到內存中(小複習:pyhon的解釋性,決定了解釋器只關心文件內容,不關心文件後綴名)。
- 第三階段:Python解釋器解釋執行剛剛加載到內存中test.py的代碼( ps:在該階段,即真正執行代碼時,纔會識別Python的語法,執行文件內代碼,當執行到name="egon"時,會開闢內存空間存放字符串"egon")。
Python解釋器與文件本編輯的異同(熟悉)
- 相同點:Python解釋器是解釋執行文件內容的,於是Python解釋器具有讀py文件的功能,這一點與文本編輯器同樣。
- 不一樣點:文本編輯器將文件內容讀入內存後,是爲了顯示或者編輯,根本不去理會Python的語法,而Python解釋器將文件內容讀入內存後,可不是爲了給你瞅一眼Python代碼寫的啥,而是爲了執行Python代碼、會識別Python語法。
字符編碼介紹(熟悉)
什麼是字符編碼
計算機要想工做必須通電,即用‘電’驅使計算機幹活,也就是說‘電’的特性決定了計算機的特性。電的特性即高低電平(人類從邏輯上將二進制數1對應高電平,二進制數0對應低電平),關於磁盤的磁特性也是一樣的道理。結論:計算機只認識數字。python
很明顯,咱們平時在使用計算機時,用的都是人類能讀懂的字符(用高級語言編程的結果也無非是在文件內寫了一堆字符),如何能讓計算機讀懂人類的字符?git
必須通過一個過程:github
- 字符 --------》翻譯過程 -------》數字
總而言之,字符編碼是將人類的字符編碼成計算機能識別的數字,這種轉換必須遵循一套固定的標準,該標準無非是人類字符與數字的對應關係,稱之爲字符編碼表。編程
涉及到字符編碼的兩個場景
- 一個Python文件中的內容是由一堆字符組成的,存取均涉及到字符編碼問題(Python文件並未執行,前兩個階段均屬於該範疇)。
- Python中的數據類型字符串是由一串字符組成的(Python文件執行時,即第三個階段)。
字符編碼發展史與分類
計算機由美國人發明,最先的字符編碼爲ASCII,只規定了英文字母數字和一些特殊字符與數字的對應關係。最多隻能用 8 位來表示(一個字節),即:2**8 = 256,因此,ASCII碼最多隻能表示 256 個符號。markdown
固然咱們編程語言都用英文沒問題,ASCII夠用,可是在處理數據時,不一樣的國家有不一樣的語言,中國人會加入中文,日本人會在本身的程序中加入日文,韓國人也是。網絡
可是要表示中文,單拿一個字節表表示一個漢子,是不可能表達完的(連小學生都認識兩千多個漢字),解決方法只有一個,就是一個字節用>8位2進製表明,位數越多,表明的變化就多,這樣,就能夠儘量多的表達出不通的漢字。編程語言
因此中國人規定了本身的標準gb2312編碼,規定了包含中文在內的字符與數字的對應關係。編輯器
日本人規定了本身的Shift_JIS編碼;韓國人規定了本身的Euc-kr編碼(另外,韓國人說,計算機是他們發明的,要求世界統一用韓國編碼,但世界人民沒有搭理他們)。post
這時候問題出現了,精通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 |
---|---|---|---|
A | 01000001 | 00000000 01000001 | 01000001 |
中 | x | 01001110 00101101 | 11100100 10111000 10101101 |
從上面的表格還能夠發現,UTF-8編碼有一個額外的好處,就是ASCII編碼實際上能夠被當作是UTF-8編碼的一部分,因此,大量只支持ASCII編碼的歷史遺留軟件能夠在UTF-8編碼下繼續工做。
內存爲何不用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編碼,咱們惟一能改變的就是存儲到硬盤時使用的編碼。
- Unicode----->encode(編碼)-------->gbk
- Unicode<--------decode(解碼)<----------gbk
掌握—》熟悉—》瞭解- 掌握:滾瓜爛熟。- 熟悉:正背如流。- 瞭解:看到可以想起。