字符編碼 簡介

1、計算機基礎之——交互

​ 操做系統、計算機硬件、應用程序組成了計算機系統。咱們在使用計算機系統處理任務時其實就是讓計算機系統的各個組成之間進行一系列複雜的交互處理,獲得咱們想要的結果。計算機硬件各組成之間的交互是經過二進制指令代碼進行的,但咱們在使用電腦時,幾乎全部可視的文本文件都是以人類經常使用的語言字符呈現的,那麼計算機系統是如何將人類語言字符轉換成二進制代碼的呢。python

​ 當咱們使用使用文本編輯器時,計算機系統是如何實現文件內容的的保存和讀取的呢。瀏覽器

2、文本編輯器存取文件的原理

一、當咱們打開一個文本編輯器,就在內存中開啓了一個進程,以後,咱們在其中編寫的內容也是存放在內存中的。此時的數據斷電即丟失。服務器

二、當咱們按下保存後,這些數據就被保存到了硬盤上,實現永久保存。編輯器

三、同理,咱們編寫的代碼文件也是同樣,在執行前都是以文本形式存在的。對於計算機來講都是一堆字符而已。編碼

3、Python解釋器執行py文件的原理

第一步:打開python解釋器,此時就至關於打開了一個文本編輯器操作系統

第二步:python解釋器至關於文本編輯器去打開py文件,從硬盤將文件內容讀取到內存中(這一步只取內容,不判斷內容是否正確)code

第三步:點擊運行後,python解釋器纔開始解釋並執行代碼(解釋一行執行一行,解釋時判斷語法,執行時纔會給變量開闢內存空間)htm

4、python解釋器與文本編輯器的異同

相同點:都可以將文本內容讀入內存,都可以編輯和保存。blog

不一樣點:文本編輯器只對文件內容操做,而python解釋器除了能對文件內容操做,還能理解內容、判斷語法、執行代碼

5、字符編碼

一、什麼是字符編碼

字符編碼就是將某種文字和字符按照必定的規則編譯成一一對應的代碼。

二、爲何要對字符進行編碼

由於計算機只認識0和1,人類要讓計算機理解人類的意圖就必須把人類經常使用的高級語言字符編譯成計算機能識別的代碼。

​ 字符 ——> 編譯規則(編碼表) ——> 二進制代碼

三、字符編碼發展史和分類

一、ASCII

在計算機中,全部的數據在存儲和運算時都要使用二進制數表示(由於計算機用高電平和低電平分別表示1和0),例如,像a、b、c、d這樣的52個字母(包括大寫)以及0、1等數字還有一些經常使用的符號(例如*、#、@等)在計算機中存儲時也要使用二進制來表示,而具體用哪些二進制數字表示哪一個符號,固然每一個人均可以約定本身的一套規則(這就叫編碼表),而你們若是要想互相通訊而不形成混亂,那麼你們就必須使用相同的編碼規則,因而美國有關的標準化組織就統一規定了英語字母和經常使用符號用哪些二進制數來表示,並於1967年發表了初版ASCII,最後一次更新則是在1986年,到目前爲止共定義了128個字符。好比空格SPACE是32(二進制00100000),大寫的字母A是65(二進制01000001)。這128個符號(包括32個不能打印出來的控制符號),只佔用了一個字節的後面7位,最前面的一位統一規定爲0。

二、其餘國家的編碼表

英語用128個符號編碼就夠了,可是對於其餘語言,128個符號就不必定夠了。隨着各國的計算機行業的發展,各國陸續推出了本身國家的編碼表。好比中國的GBK,日本的shift_JIS,韓國的Euc-kr,等等,都是對應二進制代碼的。這樣,不一樣國家之間數據交流就出現了問題,相同的二進制代碼在兩種編碼中表示不同的字符,或者一樣的字符在兩種編碼中用了不一樣的二進制代碼。用A國的編碼規則編碼的文件拿到B國的電腦上就不能正確打開了(亂碼),不利於溝通交流。

隨着全球化的發展,世界急需統一的編碼來實現信息的順暢流通,所以,號稱萬國碼的Unicode就應運而生了。

三、Unicode

號稱萬國碼的Unicode包含了全球主要國家的字符編碼,至此,不一樣國家的人們終於能夠一塊兒在互聯網的世界愉快的玩耍啦。可是,很快又有人提出了不滿。由於Unicode 是一個很大的集合,如今的規模能夠容納100多萬個符號。每一個符號的編碼都不同,好比,U+0639表示阿拉伯字母AinU+0041表示英語的大寫字母AU+4E25表示漢字。有的字符原來只要一個字節表示,有的字節須要3、四個字節表示,這麼多的字符不分類豈不亂套了,好嘛,將字符編碼的格式作了統一,都用四個字節吧,多餘的位用0補位。

這樣就形成了兩個問題:

(1)、有的文件原來只須要1mb的空間就夠了,按照Unicode卻須要4mb的空間,及其浪費。所以呢,他們不幹了,各類消極應對,各類抵制(尤爲是某老喜歡橫着走的國家)。致使Unicode 在很長一段時間內沒法推廣,直到互聯網的出現。

(2)、出現了 Unicode 的多種存儲方式,也就是說有許多種不一樣的二進制格式,能夠用來表示 Unicode。

隨着互聯網的普及,喜歡玩兒耍的網友們就強烈要求出現一種統一的編碼方式。在網友們歡快而激情的討論中呢 UTF-8 就誕生了(同時還有utf-1六、utf-32,可是對咱們沒啥niao用,都想不起來了)。至此,你們又能夠一塊兒愉快的玩耍了。

四、UTF-8

UTF-8 就是在互聯網上使用最廣的一種 Unicode 的實現方式。強調一下喔,這裏的關鍵是,UTF-8 是 Unicode 的實現方式之一。

UTF-8 最大的一個特色,就是它是一種變長的編碼方式。它可使用1~4個字節表示一個符號,根據不一樣的符號而變化字節長度。

UTF-8 的編碼規則很簡單,只有如下二條:

1)對於單字節的符號,字節的第一位設爲0,後面7位爲這個符號的 Unicode 碼。所以對於英語字母,UTF-8 編碼和 ASCII 碼是相同的。

2)對於n字節的符號(n > 1),第一個字節的前n位都設爲1,第n + 1位設爲0,後面字節的前兩位一概設爲10。剩下的沒有說起的二進制位,所有爲這個符號的 Unicode 碼。

Unicode符號範圍     |        UTF-8編碼方式
(十六進制)        |              (二進制)
----------------------+---------------------------------------------
0000 0000-0000 007F | 0xxxxxxx
0000 0080-0000 07FF | 110xxxxx 10xxxxxx
0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx
0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

跟據上表,解讀 UTF-8 編碼很是簡單。若是一個字節的第一位是0,則這個字節單獨就是一個字符;若是第一位是1,則連續有多少個1,就表示當前字符佔用多少個字節。

五、Unicode 與 UTF-8 之間的轉換

兩者的轉換能夠經過程序實現,固然,有些應用軟件提供了多種編碼模式的文件保存方法,能夠一件轉換。

六、內存爲何不直接用UTF-8呢?

有朋友又問了,UTF-8這麼好,那咱們爲何在內存中還要用Unicode呢,直接用UTF-8不行嗎?

這是由於UTF-8 是 Unicode 的實現方式之一,只管編碼存儲,無論解碼讀取,因此,當你要從硬盤上讀取島國大片的時候呢,UTF-8 就無論用啦,還得要Unicode來解碼才行。固然了,若是你非要廠家給你造一臺內存也用UTF-8的電腦呢也行,只不過那樣的話你就只能本身跟本身玩兒了。

固然了,你也能夠一直等,由於據Allen的下預測呢,隨着UTF-8 的發展呢,Unicode有可能愈來愈不被必須的,也許,在不久的未來,你們都用UTF-8啦。

七、亂碼分析

首先明確概念

  • 文件從內存寫到硬盤的操做簡稱存文件
  • 文件從硬盤讀到內存的操做簡稱讀文件

亂碼的兩種狀況:

  • 亂碼一:存文件時就已經亂碼

存文件時,因爲文件內容有各個國家的文字,咱們單以一個國家的編碼規則去存,
此時上其餘國家的文字因爲在此編碼規則中沒有找到對應的編碼而致使存儲失敗。但當咱們硬要存的時候,編輯並不會報錯,但毫無疑問,不讓存而硬存,確定是亂存了,即存文件階段就已經發生亂碼,而當咱們用此編碼規則打開文件時,此國文字能夠正常顯示,而其餘文字則亂碼了。

  • 亂碼二:存文件時不亂碼而讀文件時亂碼

存文件時用utf-8編碼,保證兼容萬國,不會亂碼,而讀文件時選擇了錯誤的解碼方式,好比gbk,則在讀階段發生亂碼,讀階段發生亂碼是能夠解決的,選對正確的解碼方式就ok了。

6、總結和補充

ASCII和Unicode的區別:ASCII編碼是1個字節,而Unicode編碼一般多於1個字節。

字母A用ASCII編碼是十進制的65,二進制的01000001;

字符0用ASCII編碼是十進制的48,二進制的00110000,注意字符'0'和整數0是不一樣的;

若是把ASCII編碼的A用Unicode編碼,只須要在前面補0就能夠,所以,A的Unicode編碼是00000000 01000001。

問題:若是統一成Unicode編碼,亂碼問題解決了。可是,若是你寫的文本基本上所有是英文的話,用Unicode編碼比ASCII編碼須要多一倍的存儲空間,存儲和傳輸都浪費。

解決措施:把Unicode編碼轉化爲「可變長編碼」的UTF-8編碼。UTF-8編碼把一個Unicode字符根據不一樣的數字大小編碼成1-6個字節,經常使用的英文字母被編碼成1個字節,漢字一般是3個字節,只有很生僻的字符纔會被編碼成4-6個字節。若是你要傳輸的文本包含大量英文字符,用UTF-8編碼就能節省空間:

UTF-8編碼有個好處,就是ASCII編碼實際上能夠被當作是UTF-8編碼的一部分,因此,大量只支持ASCII編碼的歷史遺留軟件能夠在UTF-8編碼下繼續工做

計算機系統通用的字符編碼工做方式:

在計算機內存中,統一使用Unicode編碼,當須要保存到硬盤或者須要傳輸的時候,就轉換爲UTF-8編碼。

啓動記事本程序時,從文件讀取的UTF-8字符被轉換爲Unicode字符到內存裏,編輯完成後,保存的時候再把Unicode轉換爲UTF-8保存到文件:

瀏覽網頁的時候,服務器會把動態生成的Unicode內容轉換爲UTF-8再傳輸到瀏覽器:

因此你看到不少網頁的源碼上會有相似 的信息,表示該網頁正是用的UTF-8編碼。

參考:

Nick 老師的博客:https://www.cnblogs.com/nickchen121/p/10718112.html

相關文章
相關標籤/搜索