【Python基礎】字符編碼ASCII-GBK-Unicode-UTF-8之間的關係

字符編碼
由於計算機只識別0和1,爲了使計算機能夠支持文字和字母等符號,方便實用操作計算機
於是字符編碼應運而生,旨在解決符號和人類語言與計算機0和1建立起一種對應關係
據說不理解字符編碼可能是程序員一輩子的遺憾,拿出來單獨總結一下

發展史:
    ASCII-->Unicode-->UTF-8
    ASCII是最早期應用在美國方面的,建立了A-z和一批特殊符號,一共128種字符與二進制之間的對應關係
        比如:小寫字母w   十進制135   轉換爲二進制  10000111
             空格        0                      0
        如果表示[空格][空格]w  二進制就是          0010000111    #前面的兩個0代表兩個空格
        就有個問題就是二進制本來就一串繁瑣空格和w怎麼話分界線來界定每個字符的界限呢,以致後來就統一了一下所有字符都佔8位,每次以8位界限讀取
        如果表示[空格][空格]w  二進制就是          00000000 00000000 10000111    ##這裏每1或0佔1bit(比特)
        於是乎就有了今天的ASCII碼每個字符佔1bytes(字節)
            換算關係:
                bit                 位,計算機中最小的表示單位,每個字符轉二進制後的0和1
                8bit = 1bytes(B)    字節,最小的存儲單位,1bytes縮寫爲1B
                1KB  = 1024B
                1MB  = 1024KB
                1GB  = 1024MB
                ...
        優點:建立了對應關係
        缺點:並不適用其他國家語言,其他語言解析會出現亂碼,比如中文,韓文等等...

    GBK     爲了同時滿足中文和英文(ASCII),中國人定製了GBK,也就是說這個時候中文和英文使用GBK沒問題,如果寫日文其他語言就會產生亂碼
            GBK:2Bytes代表一箇中文字符,1Bytes表示一個英文字符
            其他國家滿足自己,各個國家紛紛定製了自己的編碼
            日本把日文編到Shift_JIS裏,韓國把韓文編到Euc-kr裏

    Unicode 旨在解決其他國家語言共存的問題而應運而生,俗稱萬國編碼,僅建立在內存中
            由於ASCII 用的是 8位也就是說  最多支持 11111111 轉換成十進制255個編碼
            中文恐怕就遠遠不夠了,中文有幾萬個,後來對於中文就在原來1字節(11111111)基礎又加了1個字節

            ASCII    英文               11111111  最高支持255個字符      佔用1字節
            Unicode  支持中文  11111111 11111111  100W+                 佔用2-4字節
            Unicode爲了同時兼容8位的ASCII,在原來ASCII的8位基礎上統一添加00000000實現了 2個bytes
            之所以說unicode是定長是因爲所有的字符都是佔用2bytes
            這就是unicode(定長), 統一用2Bytes代表一個字符, 雖然2**16-1=65535,
            但unicode卻可以存放100w+個字符,因爲unicode存放了與其他編碼的映射關係,準確地說unicode並不是一種嚴格意義上的字符編碼表

    UTF-8   很明顯對於通篇都是英文的文本來說,unicode的式無疑是多了一倍的存儲空間(二進制最終都是以電或者磁的方式存儲到存儲介質中的)
            於是產生了UTF-8(可變長,全稱Unicode Transformation Format),對英文字符只用1Bytes表示,對中文字符用3Bytes,對其他
            生僻字用更多的Bytes去存。於是現在大家也都在推行UTF-8的原因之一

整個發展歷程:
    ASCII -->  GBK  -->  Unicode  -->  UTF-8
使用過程:
    基於目前的現狀,內存中的編碼固定就是unicode,我們唯一可變的就是硬盤的上對應的字符編碼。
    此時你可能會覺得,那如果我們以後開發軟時統一都用unicode編碼,那麼不就都統一了嗎,關於統一這一點你的思路是沒錯的,但我們不可會使用
    unicode編碼來編寫程序的文件,因爲在通篇都是英文的情況下,耗費的空間幾乎會多出一倍,這樣在軟件讀入內存或寫入磁盤時,都會徒增IO次數,
    從而降低程序的執行效率。因而我們以後在編寫程序的文件時應該統一使用一個更爲精準的字符編碼utf-8(用1Bytes存英文,3Bytes存中文),
    再次強調,內存中的編碼固定使用unicode。
        1、在存入磁盤時,需要將unicode轉成一種更爲精準的格式,utf-8:全稱Unicode Transformation Format,將數據量控制到最精簡
        2、在讀入內存時,需要將utf-8轉成unicode
    所以我們需要明確:內存中用unicode是爲了兼容萬國軟件,即便是硬盤中有各國編碼編寫的軟件,unicode也有相對應的映射關係,但在現在的開
    發中,程序員普遍使用utf-8編碼了,估計在將來的某一天等所有老的軟件都淘汰掉了情況下,就可以變成:內存utf-8<->硬盤utf-8的形式了。

參考:http://www.cnblogs.com/linhaifeng/articles/5950339.html
更多圖文並茂請點超鏈接

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章