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碼對應的字符是:Δ</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-8和UTF-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 這種針對不同位數使用不同字節數編碼的方式有效的利用了空間,避免了一些浪費,當然,事物都有利弊,空間降下去,時間也就升上去了;