2019-01-27-ascii-unicode

title layout categories tags excerpt
UTF-8, ASCII, unicode的介紹與區分
post
編程
utf-8 ascii unicode
關於UTF-8,ASCII,Unicode的介紹與區分

背景

人類能通過肉眼識別文字和字符,並能通過知識瞭解他們的含義,但是計算機內部不論存儲還是控制,都是通過二進制碼實現,因爲二進制的 0, 1 剛好對應基礎電路中的,然後組合進行復雜的系統控制;

將人類識別的字符轉換成計算機識別的二進制數據的過程,叫做編碼,顧名思義,編程二進制數字碼,如 0101101100011001這樣的;相反,就叫做解碼,把二進制碼解釋爲字符;

ASCII

首先ASCII全稱(American Standard Code for Information Interchange,美國信息交換標準代碼),是一個字符集,顧名思義,很多字符的集合;

像前面提到的,人類與計算機語言不通,一個識別字符,一個識別二進制,所以ASCII就充當了這樣一個翻譯官,其內容是編碼與字符的映射,即一個字符只對應一個固定的編碼,例如字符 A 的編碼爲 65,字符 a 的編碼爲 122;當然這個編碼是十進制的,計算機內部把十進制轉換成二進制就能供底層使用了;

另外需要知道的是,一字節(1 Byte)等於八比特位(8 bit),8 bit就是這樣的:01010101,八位二進制的所有不同表示一共 2^8 = 256 個,而且一般都是從 0 開始數,所以表示的十進制數的範圍就是 0 - 255,這也是ASCII編碼映射字符數的範圍,包含大小寫字母和一些其他常用的符號;

Unicode

看完上面肯定就會疑惑ASCII總共才表示256個字符,怎麼處理當今世界巨大的信息量的,由於這個字符集最初是老外發明的,表示所有字母和一些字符對他們當時來說可能很足夠了,但是先進計算機遍佈全球大部分地方,漢語、韓語、日語、阿拉伯語等語言數不過來,所以ASCII明顯不夠用了;雖然中國之前也制定了是和中文的編碼字符集叫 GB2313 等系列;

因此,便順應時代需要產生了一種更龐大的字符集叫 Unicode,有時也叫萬國碼,顧名思義,幾乎表示了世界上所有語言的字符,可以理解爲 Unique code,獨一無二的的編碼;

目前Unicode的編碼範圍達到了21位,即 0x0000 - 0x10ffff 的範圍,二進制爲 1 0000 1111 1111 1111 1111,剛好21位;十進制表示爲 1114111,就是一百萬多個字符,已經相當多了;

如果要使用UNIcode,以在 HTML 中爲例,假如知道一個字符的Unicode碼是 0x0394,那麼就在標籤中添加代碼:

Δ

放在標籤中就是:

<h5>這個Unicode碼對應的字符是:&#x0394;</h5>

結果是這樣:

這個Unicode碼對應的字符是:Δ

其實那個Unicode編碼就是對應的大小希臘字母德爾塔,數學或物理中經常用到的字符;

也可以用 JavaScript 來遍歷一部分Unicode與字符的對應關係:

for (i = 0x0000; i <= 0x00ff; i++) {
    document.write(i + ': &#x' + i + ';<br>');
}

頁面就會出現前256個字符及其Unicode碼;

UTF-8, UTF-16, UTF-32

首先UTF全稱(Unicode Transformation Format),所以它是一種針對前面提到的Unicode的編碼格式,常見的格式就是 UTF-8,還有 UTF-16, UTF-32

UTF-8 其中的 8 表示的是 8 bit,即Unicode中每8位表示一個字符,UTF-16 和 UTF-32 類似,因爲Unicode最多才21位,32位大於21位,所以 UTF-32 的格式就可以表示所有字符對應的Unicode碼了,但是呢,32位也就是4字節,讓每個字符都佔用4字節太費空間了,所以出現了UTF-8UTF-16;

UTF-8 定義 0 - 7 bit 的 Unicode 用一字節表示,這裏就與ASCII一樣了,8 - 11 bit 用兩字節表示,12 - 16 bit 用三字節表示,17 - 21 bit 用四字節表示;

UTF-8 編碼規則如下:

<style> table th, table td { border: 2px solid black; } </style>
Unicode bit UTF-8 byte
0x0000 - 0x007f 0 - 7 0XXX XXXX 1
0x0080 - 0x07ff 8 - 11 110X XXXX 10XX XXXX 2
0x0800 - 0xffff 12 - 16 1110 XXXX 10XX XXXX 10XX XXXX 3
0x1 0000 - 0x1f ffff 17 - 21 1111 0XXX 10XX XXXX 10XX XXXX 10XX XXXX 4

規律是:

  • 每個字節中不足8位的,高位(左邊)先用0補上,比如 0XXXX XXXX
  • 超過兩字節表示的UTF-8,第一個字節高位添加兩個 1 和一個 0,後面的字節高位添加 10
  • 三、四字節同理,幾個字節高位就添幾個 1 再加上一個 0,其餘字節高位添 10

可以看出 UTF-8 這種針對不同位數使用不同字節數編碼的方式有效的利用了空間,避免了一些浪費,當然,事物都有利弊,空間降下去,時間也就升上去了;

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