1. 程式人生 > >歡迎各位大神指導,評論,互相學習~

歡迎各位大神指導,評論,互相學習~

編碼產生

在計算機中,所有的資料在儲存和運算時都要使用二進位制數表示(因為計算機用高電平和低電平分別表示1和0),例如,像a、b、c、d這樣的52個字母(包括大寫)、以及0、1等數字還有一些常用的符號(例如*、#、@等)在計算機中儲存時也要使用二進位制數來表示,而具體用哪些二進位制數字表示哪個符號,當然每個人都可以約定自己的一套(這就叫編碼),而大家如果要想互相通訊而不造成混亂,那麼大家就必須使用相同的編碼規則。

編碼機制

  1. 位元組是怎麼分組的,如8 bits或16 bits一組,這也被稱作編碼單元。
  2. 編碼單元和字元之間的對映關係。例如,在ASCII碼中,十進位制65對映到字母A上

ascii編碼

標準ASCII 碼也叫基礎ASCII碼,使用7 位二進位制數(剩下的1位二進位制為0)來表示所有的大寫和小寫字母,數字0 到9、標點符號, 以及在美式英語中使用的特殊控制字元。
在這裡插入圖片描述

unicode編碼

如果你是一個生活在2003年的程式設計師,卻不瞭解字元、字符集、編碼和Unicode這些基礎知識。那你可要小心了,要是被我抓到你,我會讓你在潛水艇裡剝六個月洋蔥來懲罰你。

這個邪惡的恐嚇是Joel Spolsky在十年前首次發出的。不幸的是,很多人認為他只是在開玩笑,因此,現在仍有許多人不能完全理解Unicode,以及Unicode、UTF-8、UTF-16之間的區別。這就是我寫這篇文章的原因。

最終,美國人意識到他們應該提出一種標準方案來展示世界上所有語言中的所有字元,以便緩解程式設計師的痛苦和避免字元編碼引發的第三次世界大戰。出於這個目的,Unicode誕生了。

Unicode背後的想法非常簡單,然而卻被普遍的誤解了。Unicode就像一個電話本,標記著字元和數字之間的對映關係。Joel稱之為「神奇數字」,因為它們可能是隨機指定的,而且不會給出任何解釋。官方術語是碼位(Code Point),總是用U+開頭。理論上每種語言中的每種字元都被Unicode協會指定了一個神奇數字。例如希伯來文中的第一個字母א,是U+2135,字母A是U+0061。

Unicode並不涉及字元是怎麼在位元組中表示的,它僅僅指定了字元對應的數字,僅此而已。

關於Unicode的其它誤解包括:Unicode支援的字元上限是65536個,Unicode字元必須佔兩個位元組。告訴你這些的人應該去換換腦子了。

記住,Unicode只是一個用來對映字元和數字的標準。它對支援字元的數量沒有限制,也不要求字元必須佔兩個、三個或者其它任意數量的位元組。

Unicode字元是怎樣被編碼成記憶體中的位元組這是另外的話題,它是被UTF(Unicode Transformation Formats)定義的。

這裡就有兩個嚴重的問題,第一個問題是,如何才能區別 Unicode 和 ASCII ?計算機怎麼知道三個位元組表示一個符號,而不是分別表示三個符號呢?第二個問題是,我們已經知道,英文字母只用一個位元組表示就夠了,如果 Unicode 統一規定,每個符號用三個或四個位元組表示,那麼每個英文字母前都必然有二到三個位元組是0,這對於儲存來說是極大的浪費,文字檔案的大小會因此大出二三倍,這是無法接受的。

它們造成的結果是:
1)出現了 Unicode 的多種儲存方式,也就是說有許多種不同的二進位制格式,可以用來表示 Unicode。
2)Unicode 在很長一段時間內無法推廣,直到網際網路的出現。

utf-8編碼

UTF-8 是一個非常驚豔的編碼方式,漂亮的實現了對 ASCII 碼的向後相容,以保證 Unicode 可以被大眾接受。

UTF-8 是目前網際網路上使用最廣泛的一種 Unicode 編碼方式,它的最大特點就是可變長。它可以使用 1 - 4 個位元組表示一個字元,根據字元的不同變換長度。編碼規則如下:

  1. 對於單個位元組的字元,第一位設為 0,後面的 7 位對應這個字元的 Unicode 碼點。因此,對於英文中的 0 - 127 號字元,與 ASCII 碼完全相同。這意味著 ASCII 碼那個年代的文件用 UTF-8 編碼開啟完全沒有問題。

  2. 對於需要使用 N 個位元組來表示的字元(N > 1),第一個位元組的前 N 位都設為 1,第 N + 1 位設為0,剩餘的 N - 1 個位元組的前兩位都設位 10,剩下的二進位制位則使用這個字元的 Unicode 碼點來填充。
    編碼規則如下:
    在這裡插入圖片描述
    根據上面編碼規則對照表,進行 UTF-8 編碼和解碼就簡單多了。下面以漢字“漢”為利,具體說明如何進行 UTF-8 編碼和解碼。
    “漢”的 Unicode 碼點是 0x6c49(110 1100 0100 1001),通過上面的對照表可以發現,0x0000 6c49 位於第三行的範圍,那麼得出其格式為 1110xxxx 10xxxxxx 10xxxxxx。接著,從“漢”的二進位制數最後一位開始,從後向前依次填充對應格式中的 x,多出的 x 用 0 補上。這樣,就得到了“漢”的 UTF-8 編碼為 11100110 10110001 10001001,轉換成十六進位制就是 0xE6 0xB7 0x89。
    解碼的過程也十分簡單:如果一個位元組的第一位是 0 ,則說明這個位元組對應一個字元;如果一個位元組的第一位1,那麼連續有多少個 1,就表示該字元佔用多少個位元組。

gb2312編碼

(1)GB2312字符集
  GB2312是漢字字符集和編碼的代號,中文全稱為“資訊交換用漢字編碼字符集”,由中華人民共和國國家標準總局釋出,一九八一年五月一日實施。GB是“國標” 二字的漢語拼音縮寫。

(2)GB2312字符集 (character set) 只收錄簡化字漢字,以及一般常用字母和符號,主要通行於中國大陸地區和新加坡等地。

(3)GB2312 共收錄有 7445 個字元,其中簡化漢字 6763 個,字母和符號 682 個。

(4)GB2312 將所收錄的字元分為 94 個區,編號為 01 區至 94 區;每個區收錄 94 個字元,編號為 01 位至 94 位。GB2312 的每一個字元都由與其唯一對應的區號和位號所確定。例如:漢字“啊”,編號為 16 區 01 位。

(5)GB2312 字符集的區位分佈表:
區號 字數 字元類別
01 94 一般符號
02 72 順序號碼
03 94 拉丁字母
04 83 日文假名
05 86 Katakana
06 48 希臘字母
07 66 俄文字母
08 63 漢語拼音符號
09 76 圖形符號
10-15 備用區
16-55 3755 一級漢字,以拼音為序
56-87 3008 二級漢字,以筆劃為序
88-94 備用區

舉例來說,“啊”字是GB2312之中的第一個漢字,它的區位碼就是1601。位元組編碼,通常採用EUC儲存方法,以便兼容於ASCII。每個漢字及符號以兩個位元組來表示 。第一個位元組稱為“高位位元組”,第二個位元組稱為“低位位元組”。 “高位位元組”使用了0xA1-0xF7(把01-87區的區號加上0xA0),“低位位元組”使用了0xA1-0xFE(把01-94加上0xA0)。例如 “啊”字在大多數程式中,會以0xB0A1儲存(與區位碼對比:0xB0=0xA0+16,0xA1=0xA0+1)。

好用的工具

  1. notepad++,可以設定檔案編碼
    在這裡插入圖片描述

  2. UltraEdit,可以檢視檔案的16進位制位元組流
    在這裡插入圖片描述

參考文獻