字符編碼

字符編碼

十進制到二進制的轉換隻能解決計算機理解數字的問題,那麼文字要怎麼讓計算機理解呢?python

既然數字能夠轉換成十進制,咱們只要想辦法把文字轉成數字,這樣文字就能夠表示成二進制了。編程

但是文字應該怎麼轉換成數字呢?答案是強制轉換,簡單粗暴。咱們本身強行約定了一個表,把文字和數字對應上,這張表就至關於翻譯,咱們能夠拿着一個數字來對比對應表找到相應的文字,反之亦然。windows

1、ASCII碼

下面這張表就是計算機顯示各類文字、符號的基石。網絡

ASCII(American Standard Code for Information Interchange,美國信息交換標準代碼)是基於拉丁字母的一套電腦編碼系統,主要用於顯示代碼英語和其它西歐語言。它是現今最通用的單字節編碼系統,並等同於國際標準ISO/IEC 646。編程語言

因爲計算機是美國人發明的,所以,最先只有127個字符被編碼到計算機裏,也就是大小寫英文字母、數字和一些符號,這個編碼表被稱爲ASCII編碼,好比大寫字母A的編碼是65,小寫字母z的編碼是122。後128個稱爲擴展ASCII碼。編碼

那如今咱們就知道了上面的字母符號和數字對應的表是早就存在的。那麼根據如今有的一些十進制,咱們就能夠轉換成二進制的編碼串。好比:操作系統

一個空格對應的數字是0          翻譯成二進制就是0(注意字符'0'和整數0是不一樣的)
一個對勾√對應的數字是251       翻譯成二進制就是11111011

問:假如咱們要打印兩個空格一個對勾 寫做二進制就應該是 0011111011, 可是問題來了,咱們怎麼知道從哪兒到哪兒是一個字符呢?.net

正是因爲這些字符串長的長,短的短,寫在一塊兒讓咱們難以分清每個字符的起止位置,因此聰明的人類就想出了一個解決辦法,既然一共就這255個字符,那最長的也不過是11111111八位,不如咱們就把全部的二進制都轉換成8位的,不足的用0來替換。翻譯

這樣一來,剛剛的兩個空格一個對勾就寫做000000000000000011111011,讀取的時候只要每次讀8個字符就能知道每一個字符的二進制值啦。在這裏,每一位0或者1所佔的空間單位爲bit(比特),這是計算機中最小的表示單位。設計

每8個bit組成一個字節,這是計算機中最小的存儲單位(畢竟你是沒有辦法存儲半個字符的)

bit           位,計算機中最小的表示單位
8bit = 1bytes 字節,最小的存儲單位,1bytes縮寫爲1B
1KB=1024B
1MB=1024KB
1GB=1024MB
1TB=1024GB
1PB=1024TB
1EB=1024PB
1ZB=1024EB
1YB=1024ZB
1BB=1024YB

2、GB2312 & GBK

英文問題是解決了, 咱們中文如何顯示呢? 美國佬設計ASSCII碼的時候應該是沒考慮中國人有一天也能用上電腦, 因此根本沒考慮中文的問題,上世界80年代,電腦進入中國,把磚家們難倒了,媽的你個一ASSCII只能存256個字符,我經常使用漢字就幾千個,怎麼玩???勒緊褲腰帶還蘇聯貸款的時候咱們都挺過來啦,這點小事難不到咱們, 既然美帝的ASCII不支持中文,那咱們本身搞張編碼表不就好了, 因而咱們設計出了GB2312編碼表,長成下面的樣子。一共存了6763個漢字。

這個表格比較大,像上面的一塊塊的文字區域有72個,這致使經過一個字節是沒辦法表示一個漢字的(由於一個字節最多容許256個字符變種,你如今6千多個,只能2個字節啦,2**16=65535個變種)。

有了GB2312,就行了。但咱們寫字居然會出現中英混雜的狀況,好比「我是小猿圈,個人英文名叫Apeland.」, 這種你怎麼辦?這就要求你必須在gb2312裏同時支持英文,可是還不能是2個字節表示一個英文字母。人家ASCII用一個字符,你用2個,那一個2mb大小的英文文檔只要一改編碼,就馬上變成4mb, 太坑爹,中國人你有錢也不能這麼造呀。 因此中國磚家們又經過神奇手段兼容了ASSCII, 即遇到中文用2個字節,遇到英文直接用ASCII的編碼。怎麼作到的呢?

如何區別連在一塊兒的2個字節是表明2個英文字母,仍是一箇中文漢字呢? 中國人如此聰明,決定,若是2個字節連在一塊兒,且每一個字節的第1位(也就是至關於128的那個2進制位)若是是1,就表明這是個中文,這個首位是128的字節被稱爲高字節。 也就是2個高字節連在一塊兒,必然就是一箇中文。你怎麼如此篤定?由於0-127已經表示了英文的絕大部分字符,128-255是ASCII的擴展表,表示的都是極特殊的字符,通常沒什麼用。因此中國人就直接拿來用了。

自1980年發佈gb2312以後,中文一直用着沒啥問題,隨着我的電腦進入千家萬戶,有人發現,本身的名字居然打印不出來,由於起的太生僻了。

因而1995年, 磚家們又升級了gb2312, 加入更多字符,連什麼藏語、維吾爾語、日語、韓語、蒙古語什麼的通通都包含進去了,國家統一亞洲的野心從這些基礎工做中就可見一斑哈。 這個編碼叫GBK,一直到如今,咱們的windows電腦中文版本的編碼就是GBK。

3、編碼混戰時代

中國人在搞本身編碼的同時,世界上其它非英語國家也得用電腦呀,因而都搞出了本身的編碼,你能夠想獲得的是,全世界有上百種語言,日本把日文編到Shift_JIS裏,韓國把韓文編到Euc-kr裏,各國有各國的標準,就會不可避免地出現衝突,結果就是,在多語言混合的文本中,顯示出來會有亂碼。以前你從玩個日本遊戲,往本身電腦上一裝,就顯示亂碼了。

這麼亂極大了阻礙了不一樣國家的信息傳遞,因而聯合國出面,發誓要解決這個混亂局面。

所以,Unicode應運而生。Unicode把全部語言都統一到一套編碼裏,這樣就不會再有亂碼問題了。Unicode 2-4字節 已經收錄136690個字符,並還在一直不斷擴張中…

Unicode標準也在不斷髮展,但最經常使用的是用兩個字節表示一個字符(若是要用到很是偏僻的字符,就須要4個字節)。現代操做系統和大多數編程語言都直接支持Unicode

Unicode有2個特色:

一、支持全球全部語言。

二、能夠跟各類語言的編碼自由轉換,也就是說,即便你gbk編碼的文字 ,想轉成unicode很容易。

爲什麼unicode能夠跟其它語言互相轉換呢? 由於有跟全部語言都有對應關係哈,這樣作的好處是可讓那些已經用gbk或其它編碼寫好的軟件容易的轉成unicode編碼 ,利於unicode的推廣。 下圖就是unicode跟中文編碼的對應關係。

4、UTF-8

新的問題又出現了:若是統一成Unicode編碼,亂碼問題今後消失了。可是,若是你寫的文本基本上所有是英文的話,用Unicode編碼比ASCII編碼須要多一倍的存儲空間,因爲計算機的內存比較大,而且字符串在內容中表示時也不會特別大,因此內容可使用unicode來處理,可是存儲和網絡傳輸時通常數據都會很是多,那麼增長1倍將是沒法容忍的!!!

爲了解決存儲和網絡傳輸的問題,出現了Unicode Transformation Format,學術名UTF,即:對unicode字符進行轉換,以便於在存儲和網絡傳輸時能夠節省空間!

UTF-8: 使用一、二、三、4個字節表示全部字符;優先使用1個字符、沒法知足則使增長一個字節,最多4個字節。英文佔1個字節、歐洲語系佔2個、東亞佔3個,其它及特殊字符佔4個。

UTF-16: 使用二、4個字節表示全部字符;優先使用2個字節,不然使用4個字節表示。

UTF-32: 使用4個字節表示全部字符;

總結:UTF 是爲unicode編碼 設計 的一種 在存儲 和傳輸時節省空間的編碼方案。

若是你要傳輸的文本包含大量英文字符,用UTF-8編碼就能節省空間:

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

搞清楚了ASCIIUnicodeUTF-8的關係,咱們就能夠總結一下如今計算機系統通用的字符編碼工做方式:

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

5、經常使用編碼介紹一覽表

6、Py2  VS  Py3編碼

python生下來的時候 尚未unicode&utf-8, 因此龜叔選用的默認編碼只能是ASCII, 一真到py2.7,用的仍是ASCII, 致使Py默認只支持英文,想支持其它語言,必須單獨配置。

直接寫中文執行會報錯的。

須要在文件開頭聲明文件的編碼才能寫中文

# -*-coding:utf-8-*-

不過注意若是你的電腦 是windows系統 , 你的系統默認編碼是GBK ,你聲明的時候要聲明成GBK, 不能是utf-8, 不然依然是亂碼,由於gbk天然不認識utf-8。

在Py2裏編碼問題很是頭疼,若不是完全理解編碼之間的各類關係,會常常容易出現亂碼而不知所措。

到了Py3推出後,終於把默認編碼改爲了unicode, 同時文件存儲編碼變成了utf-8,意味着,不用任何聲明,你就能夠寫各類語言文字在你的Python程序裏。 今後,程序們手牽手過上了快樂的生活。

相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息