字符編碼研究

字符編碼研究

   
     應用開發中,經常會遇到亂碼的問題,對於新手尤其如此。爲了解決亂碼問題帶來的困擾,特整理一下字符編碼的相關知識,從根本上杜絕亂碼的出現。

一,相關概念
   在計算機的世界中,所有的信息都是由01組成的二進制信息,當然也包含字符。字符是各種文字和符號的總稱,包括各國家文字、標點符號、圖形符號、數字等。那麼如何將這些字符轉換成計算機理解的二進制信息就是編碼過程,如何將二進制信息轉換成我們理解的字符就是解碼過程。比如怎麼把“漢字”轉換成二進制,怎麼把0xBABA解釋成字符。
   
   字符集(Charset)簡單的說就是字符的集合,集合中的每個字符都有一個碼位值表示它在字符集中的座標,通過這個座標就可以唯一的確定一個字符。常見的字符集有ASCII字符集、GB2312字符集、BIG5字符集、GB18030字符集、Unicode字符集等等。由於世界上存在非常多種的語言、文字,所以字符集也是百花齊放、形態各異。

   字符編碼(Character Encoding)就是字符集中的字符與計算機中的二進制信息互相轉換的規則。

    舉個栗子,Unicode字符集包含了世界上的所有字符,而UTF-8就是基於Unicode字符集的字符編碼。當然我們也可以直接用字符集中的碼位值表示字符編碼,比如ASCII字符集中,字符A通過編碼後的值爲65,而A在ASCII字符集中的碼位值就是65。一會兒再對Unicode和UTF-8做個詳細的例子,就可以更好的理解這個問題了。

     有的地方把字符集與字符編碼作爲同一個概念,這樣也是合理的,因爲用他們都可以描述字符與二進制信息的映射關係,也就可以進行編解碼。

二,字符集之間的關係
    1.計算機誕生於美國,所以他的“母語”就是英語。英文中一共有26個字母,算上大小寫以及標點符號不足128個,以一個字節表示足夠,這就是ASCII編碼。ASCII 編碼對於我們再熟悉不過了,具體每個字母對應碼位是多少很多人都能背下來,它是全世界通用的一種編碼方式,http協議就是基於ASCII字符集的。

   2.ASCII字符集只能表示128個字符,但是美國在歐洲的朋友們可不都是講英語的,他們需要一些其他字符(認真你就輸了),所以就有了我們熟悉的ISO-8859-1,這是好多平臺的默認編碼。其實ISO制定了一系列的標準,它們是 ISO-8859-1~ISO-8859-15。這些字符編碼都是基於單字節的,所以最多可以表示256個字符。

   3.對於中國這個文化大國,常用的文字就有兩千多,一個字節肯定是表示不過來的。於是我們就有了自己的編碼GB2312,它是雙字節編碼的,包括6763個漢字和682個其它符號。

   4.後來,又對GB2312字符集做了擴展,於是有了GBK。GBK是兼容GB2312的,也就是說GB2312中的編碼方式在GBK中被保留了下來。

   5.再然後,感覺GBK中還是缺少了一些特殊的符號圖形什麼的,於是又對GBK做了擴展。擴展後的字符集爲GB18030,同樣對之前的字符集是兼容的。GB18030中幾乎包含了所有少數名族的文字圖案以及特殊符號。

三,Unicode,UCS與UTF-8
  1, 每個語言區域用自己的字符集處理字符信息是沒有問題的,但是在訪問其它語言的內容就會出現錯誤。於是國際組織就設計出了世界通用的字符集Unicode。Unicode就是要表示世界上所有的字符,可以把它看成是所有字符集的並集,出現在不同字符集中同樣的字符在Unicode中對應一個編碼。

  2,Unicode的全稱是"Universal Multiple-Octet Coded Character Set",基於通用字符集的思想有兩種具體的實現,一個UCS-2和UCS-4。看名字就知道,UCS-2使用的是兩個字節,而UCS-4使用的是四個字節。兩個字節一共可以表示2的16次方,即65536個字符,幾乎可以涵蓋世界上所有的字符了,UCS-2就是最常用的Unicode編碼方案。

  3,現實中我們經常會用各種聊天工具在網上與他人交流,所以字符就需要在不同的計算機直接傳輸。用兩個字節表示一個字符看起來已經非常節省空間且方便使用了,但是它在傳輸中仍然存在確定。首先,對於最常用的英文字母等字符只需要一個字節表示就夠了,不需要用兩個字節,如果所有字符都用兩個字節傳輸會浪費網絡的帶寬而且耗時。其次,如果接收端收到了兩個字節,那麼是第一個字節在高位還是第二個字節在高位呢(它有一種解決方法就是添加BOM)?UTF-8編碼徹底解決了上面的兩個問題,它是一種變長的編碼方式,越常用的字符佔用的字節越少。與哈夫曼編碼的思想相同,所以對同樣的一段文字編碼,UTF-8編碼後的期望字節數更少。表中就是UCS-2到UTF-8的編碼規則

UCS-2編碼(16進制) UTF-8 字節流(二進制)
0000 - 007F 0xxxxxxx
0080 - 07FF 110xxxxx 10xxxxxx
0800 - FFFF 1110xxxx 10xxxxxx 10xxxxxx



推薦兩篇文章,本文也有借鑑
1,http://www.cnblogs.com/imissherso/articles/640727.html
2,https://zh.wikipedia.org/wiki/%E5%AD%97%E7%AC%A6%E7%BC%96%E7%A0%81

發佈了51 篇原創文章 · 獲贊 11 · 訪問量 25萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章