2、文本編輯器存取文件的原理windows
3、Python解釋器執行py文件的原理網絡
4、Python解釋器與文件本編輯的異同編程語言
5、字符編碼介紹編輯器
5.1 什麼是字符編碼編碼
計算機要想工做必須通電,即用‘電’驅使計算機幹活,也就是說‘電’的特性決定了計算機的特性。電的特性即高低電平(人類從邏輯上將二進制數1對應高電平,二進制數0對應低電平),關於磁盤的磁特性也是一樣的道理。結論:計算機只認識數字。翻譯
很明顯,咱們平時在使用計算機時,用的都是人類能讀懂的字符(用高級語言編程的結果也無非是在文件內寫了一堆字符),如何能讓計算機讀懂人類的字符?3d
必須通過一個過程:code
總而言之,字符編碼是將人類的字符編碼成計算機能識別的數字,這種轉換必須遵循一套固定的標準,該標準無非是人類字符與數字的對應關係,稱之爲字符編碼表。orm
5.2 涉及到字符編碼的兩個場景
5.3 字符編碼發展史與分類
計算機由美國人發明,最先的字符編碼爲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 |
---|---|---|---|
A | 01000001 | 00000000 01000001 | 01000001 |
中 | x | 01001110 00101101 | 11100100 10111000 10101101 |
從上面的表格還能夠發現,UTF-8編碼有一個額外的好處,就是ASCII編碼實際上能夠被當作是UTF-8編碼的一部分,因此,大量只支持ASCII編碼的歷史遺留軟件能夠在UTF-8編碼下繼續工做。
5.4 內存爲何不用UTF-8呢?
說了那麼一大堆,那爲何內存用Unicode,而不直接使用UTF-8呢?這樣不就能夠直接把代碼從內存直接丟入硬盤了嗎?出現這個問題的緣由是硬盤中還躺了其餘國家的代碼,各個國家的代碼的二進制還須要運行在計算機上使用,所以內存中必須使用Unicode的編碼,由於Unicode能和硬盤中其餘國家的二進制中的代碼進行轉換,可是UTF-8只是簡化了代碼的存儲,它並不能與其餘國家硬盤中的代碼進行關係轉換。總而言之只有Unicode編碼才能運行其餘國家硬盤中的代碼,而UTF-8的代碼沒法進行該操做。
內存中還使用Unicode編碼,是由於歷史遺留問題形成的,可是由於如今寫代碼使用的都是UTF-8代碼,因此之後內存中的代碼都將變成UTF-8代碼,而且之前遺留的各個國家的代碼都將被淘汰,因此將來內存中使用的編碼也將使用UTF-8編碼替代Unicode編碼。
5.5 字符編碼之文本編輯器操做
5.6 亂碼分析
亂碼的兩種狀況:
存文件時,因爲文件內有各個國家的文字,咱們單以shiftjis去存,
本質上其餘國家的文字因爲在shiftjis中沒有找到對應關係而致使存儲失敗。但當咱們硬要存的時候,編輯並不會報錯(難道你的編碼錯誤,編輯器這個軟件就跟着崩潰了嗎???),但毫無疑問,不能存而硬存,確定是亂存了,即存文件階段就已經發生亂碼,而當咱們用shiftjis打開文件時,日文能夠正常顯示,而中文則亂碼了。
存文件時用utf-8編碼,保證兼容萬國,不會亂碼,而讀文件時選擇了錯誤的解碼方式,好比gbk,則在讀階段發生亂碼,讀階段發生亂碼是能夠解決的,選對正確的解碼方式就ok了。
6、總結
Unicode<--------decode(解碼)<----------gbk
Unicode<--------decode(解碼)<----------gbk
什麼格式存儲, 就什麼格式讀取 就不會亂碼(牢記這句話)windows電腦的記事本默認爲gbk編碼,除此以外其餘的軟件默認編碼爲utf8