關於字元編碼

orchid發表於2013-07-18

對於程式設計新手,字元編碼問題一直都是個很棘手,很令人捉急的問題。在google上搜尋字元編碼,文章很多,其中不乏全面清楚地好文。 這篇文章應該不屬於上述之列,只是為解決手頭一個難題而去再次次研究這個問題中的一些總結與體會。

對於任何一個陌生的概念都可以用下面這三個問題描述一番:What? Why? How?

1, 什麼是字元編碼?為什麼要對字元進行編碼?

我們開啟一個文字檔案,看到了裡面熟悉的文字,但是計算機看到的只是一堆01。字元編碼就是制定一個規則,把我們認識的字元與計算機認識01串一一對應起來。 而文字閱讀器做的事就是從硬碟上讀一堆0和1,讀取檔案的編碼資訊,用特定的編碼規則把01字串對映成字元,顯示在螢幕上。

2, 如何對字元進行編碼?

下面常用到的幾種編碼格式:

  1. ASCII

    歷史就不說了,參考資料裡有。

    用1位元組8位表示,但只用最後7位,第一位全為0,所以共128個符號,其中包括32個不能列印出來的控制符號。

  2. Unicode

    Unicode是一個很大的集合,現在的規模可以容納100多萬個符號,基本上現在世界上人們使用的符號都包含在unicode裡面了吧!但是Unicode只是一個符號集,它只規定了符號的二進位制程式碼,卻沒有規定這個二進位制程式碼應該如何儲存(既然不涉及到儲存,就沒有用幾位表示的問題)。正是由於unicode集合的龐大,導致必須找到一種合理的儲存方式,減少空間佔用量。

  3. UTF-8

    UTF-8是Unicode的實現方式之一。

    UTF-8最大的一個特點,就是它是一種變長的編碼方式。它可以使用1~4個位元組表示一個符號,根據不同的符號而變化位元組長度。

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

  • 對於單位元組的符號,位元組的第一位設為0,後面7位為這個符號的unicode碼。因此對於英語字母,UTF-8編碼和ASCII碼是相同的。
  • 對於n位元組的符號(n>1),第一個位元組的前n位都設為1,第n+1位設為0,後面位元組的前兩位一律設為10。剩下的沒有提及的二進位制位,全部為這個符號的unicode碼。

下表總結了編碼規則,字母x表示可用編碼的位。

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

 

已知"嚴"的unicode是4E25(100111000100101),根據上表,可以發現4E25處在第三行的範圍內(0000 0800-0000 FFFF),因此" 嚴"的UTF-8編碼需要三個位元組,即格式是"1110xxxx 10xxxxxx 10xxxxxx"。然後,從"嚴"的最後一個二進位制位開始,依次從後向前填入格式中的x,多出的位補0。這樣就得到了,"嚴"的UTF-8編碼是"11100100 10111000 10100101",轉換成十六進位制就是E4B8A5。

  1. GB2312

    GB2312-80的簡稱。簡體中文最常用編碼,使用2位元組表示。共6763個漢字和682個其他符號。

     

  2. GBK

    微軟對GB2312的擴充套件。GBK 收錄了 21886 個符號,它分為漢字區和圖形符號區。漢字區包括 21003 個字元。

     

  3. BIG5

    繁體中文常用這個。

 

3, 考慮的一些編碼問題

  1. 輸入法?

    我感覺編輯器與輸入法肯定是有通訊的,輸入法知道文字編輯器當前編碼格式,然後將按鍵轉化為對應的編碼傳給編輯器。具體原理不太清楚,以後有時間細研究。

  2. 記事本的編碼

    任何文字編輯器都會涉及到編碼問題。記事本作為廣大windows使用者必備工具,有時成也記事本,敗也記事本。有時用記事本開啟一個文字檔案,發現裡面全是亂碼。這是因為記事本能夠解析的編碼方式是有四種:ANSI, Unicode, UFF-8和Unicode big endian。你儲存記事本的時候,彈出框最下面有個Encoding,它支援的編碼就列在那裡。因為我的系統是英文版,因此只有這四種,不同語言的作業系統可能還有其它的。 一個文字檔案應該在它的檔案頭資訊裡面加入編碼資訊的,這個是給計算機上的讀取程式讀的,如果記事本開啟的是亂碼,把它所有支援的編碼格式試一遍,如果不行就用word開啟,word支援的編碼格式非常多。記事本也給我們提供了一個非常方便的進行格式轉換的方式,比如我有一個ANSI的檔案想轉換為UTF-8,只要用記事本開啟,另存為,然後選擇UTF-8編碼格式就可以。

    下面是對這四種編碼方式的一些說明:

    裡面有四個選項:ANSI,Unicode,Unicode big endian 和 UTF-8。

    1)ANSI是預設的編碼方式。對於英文檔案是ASCII編碼,對於簡體中文檔案是GB2312編碼(只針對Windows簡體中文版,如果是繁體中文版會採用Big5碼)。

    2)Unicode編碼指的是UCS-2編碼方式,即直接用兩個位元組存入字元的Unicode碼。這個選項用的little endian格式。

    3)Unicode big endian編碼與上一個選項相對應。

    4)UTF-8編碼,也就是上一節談到的編碼方法。

參考文章:

  1. http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html
  2. http://www.crifan.com/files/doc/docbook/char_encoding/release/html/char_encoding.html

相關文章