UTF-8 是什麼?全文完整解析
更新日期: 2024 年 9 月 14 日
當我們將文字與數字輸入電腦中,這些內容會藉由「字符編碼」這種方式,將將文字和符號轉換成計算機可以理解的數字。
你可以把它想像成是一種「翻譯」過程,將我們用來讀寫的字母和符號變成二進位( 0 和 1)的形式,讓計算機能夠存儲、處理和顯示這些文字。
不同的字符編碼系統,比如 ASCII 和 Unicode,用不同的方式來「翻譯」這些字符,以確保文字在各種設備和軟體正確顯示。
在眾多 Unicode 編碼方式中,UTF-8 因其靈活性和高效性成為最廣泛使用的編碼方式之一。
這篇文章將帶你深入了解 UTF-8 的運作原理、優點以及它在全球化應用中的重要性。
ASCII 編碼介紹
ASCII(美國信息交換標準代碼)是一種早期的字符編碼標準,用於將英文字母、數字和符號轉換成計算機可以理解的數字。
它在 1960 年代被引入,並迅速成為當時計算機和通信系統的標準。
ASCII 是由美國標準協會(ASA)在 1963 年制定,目的在標準化字符編碼,促進不同計算機和設備之間的通信。
ASCII 使用 7 位元(bit)來表示一個字符,總共可以編碼 128 個不同的字符。
十進位 | 二進位 | 字符 |
---|---|---|
32 | 00100000 | 空格 |
33 | 00100001 | ! |
34 | 00100010 | “ |
35 | 00100011 | # |
36 | 00100100 | $ |
37 | 00100101 | % |
38 | 00100110 | & |
39 | 00100111 | ‘ |
40 | 00101000 | ( |
41 | 00101001 | ) |
42 | 00101010 | * |
43 | 00101011 | + |
44 | 00101100 | , |
45 | 00101101 | – |
46 | 00101110 | . |
47 | 00101111 | / |
48 | 00110000 | 0 |
49 | 00110001 | 1 |
50 | 00110010 | 2 |
51 | 00110011 | 3 |
52 | 00110100 | 4 |
53 | 00110101 | 5 |
54 | 00110110 | 6 |
55 | 00110111 | 7 |
56 | 00111000 | 8 |
57 ~ 127 | 00111000 ~ 01111111 | 省略 |
(其他省略部分可以去「維基百科」查看完整對照表)
ASCII 簡單且易於實現,適合早期的計算機應用。然而,它只能表示 128 個字符,無法涵蓋其他語言的文字和特殊符號,,例如中文、日文、韓文或阿拉伯文等。
此外,ASCII 無法表示許多現代計算機應用中需要的特殊字符和符號,例如各種貨幣符號、數學符號以及技術符號。
雖然後來擴展的 ASCII(使用 8 位元組)增加了 128 個字符,但這些擴展字符的使用並不統一,導致不同系統之間的不兼容問題。
這些限制促使了 Unicode 和 UTF-8 編碼的發展,以支持全球所有語言和符號,實現真正的國際化和多語言支持。
Unicode 的出現
Unicode 由 Unicode 聯盟於 1991 年制定,目的在為世界上所有的書寫系統,提供一個統一的字符集。
每個字符都分配有一個唯一的編碼點,確保不同系統之間的一致性和互操作性。
Unicode 覆蓋了超過 140,000 個字符,支持包括拉丁文、漢字、阿拉伯文在內的多種語言,並且不斷擴展,適應新符號和新語言的需求。
Unicode 編碼方式
- UTF-8:廣泛應用於網頁、電子郵件、文件系統等。
- UTF-16:常用於操作系統內部,如 Windows 和 Java。
- UTF-32:主要用於需要快速隨機存取字符的場合,因為每個字符的編碼長度固定。
- UCS-2:早期的 Unicode 標準,已被 UTF-16 取代。
Unicode 規範包括了從 U+0000 到 U+10FFFF 的編碼範圍,可以表示 1,114,112 個字符,目前已分配了超過 140,000 個字符。
其中 U+ 是 Unicode 編碼標準中的一種表示方式,用來標示字符的編碼點。
每個字符都有一個唯一的編碼點,格式為 U+ 後跟一個十六進位數字。例如,U+0041 表示字符 ‘A’。
將 Unicode 編碼點轉換成二進位數據涉及以下步驟:
- Unicode 編碼點:例如 U+0041。
- 轉換成二進位:首先將十六進位數字轉換成二進位。
編碼點 | 十六進位 | 二進位 |
---|---|---|
U+0041 | 0041 | 0000 0000 0100 0001 |
備註
在 Unicode 編碼中,16 進位前面加 “00” 是為了表示完整的 16 位元(2 個字節)。
這種表示方式特別適用於 UTF-16 編碼方式。
在 UTF-16 中,每個字符都需要至少 2 個字節,因此對於範圍在 U+0000 至 U+00FF 之間的字符,會在前面加 “00” 以符合 16 位元的表示法。
二進位 (Binary) | 十進位 (Decimal) | 十六進位 (Hexadecimal) | 位元 (Bit) | 字節 (Byte) |
---|---|---|---|---|
0 | 0 | 0 | 1 | 0 |
1 | 1 | 1 | 2 | 0 |
0000,0000 ~ 1111,1111 | 0 ~ 255 | 00 ~ FF | 8 | 1 |
0000,0000,0000,0000 ~ 1111,1111,1111,1111 | 0 ~ 65,535 | 00,00 ~ FF,FF | 16 | 2 |
0000,0000,0000,0000,0000,0000,0000,0000 ~ 1111,1111,1111,1111,1111,1111,1111,1111 | 0 ~ 4,294,967,295 | 00,00,00,00 ~ FF,FF,FF,FF | 32 | 4 |
UTF-8 編碼
UTF-8 是一種變長編碼方式,會根據字符的編碼範圍,使用 1 至 4 個字節來編碼字符,用來表示 Unicode 字符。
白話來說,可以想像你有一個快遞公司,你需要寄送各種大小的包裹。
有些包裹很小,只需要一個小盒子(1 字節)就能裝下,而有些包裹比較大,需要中盒子(2 字節),甚至大盒子(3 或 4 字節)。
在這個例子中:
- 小包裹對應的是 ASCII 字符,只需要 1 字節。
- 中等包裹對應的是那些需要 2 字節的字符。
- 大包裹對應的是那些需要 3 或 4 字節的字符。
這樣一來,快遞公司可以根據包裹的大小選擇合適的盒子,不會浪費空間。
同樣,UTF-8 編碼會根據字符的需要,使用最少的字節來表示字符,這就是「變長編碼」。這種方法既節省了空間,又能靈活應對不同大小的字符。
字節編碼規則
1 字節編碼
- 範圍:U+0000 至 U+007F
- 格式:0xxxxxxx
2 字節編碼
- 範圍:U+0080 至 U+07FF
- 格式:110xxxxx 10xxxxxx
3 字節編碼
- 範圍:U+0800 至 U+FFFF
- 格式:1110xxxx 10xxxxxx 10xxxxxx
4 字節編碼
- 範圍:U+10000 至 U+10FFFF
- 格式:11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
字節填充規則
當編碼 Unicode 字元到 UTF-8 時,我們遵循 UTF-8 編碼規則。
具體要點如下:
- Unicode 二進位表示:U+0080 的二進位是 10000000。
- 需要兩個字節來表示:格式是 110xxxxx 10xxxxxx。
我們以 Unicode 的 U+0080 做為參考範例,將其轉換成 UTF-8 的格式。
首先將 U+0080 轉換成二進位表示:1000,0000。
接者選擇對應的編碼格式,由於 1000,0000 需要分配到兩字節,因此選取對應的格式:「110xxxxx 10xxxxxx」。
共有 11 個 X 需要被填空,可以分成第一字節的 5 個有效位,第二字節的 6 個有效位。
具體來說,先將二進位 10000000 後 6 位的「000000」拆解出來,在將剩下的位數自行獨立出來「10」,不足的地方補 0。
最後變成:
- 前 5 位:10(補足 3 個 0)→ 00010
- 後 6 位:000000。
填上對應的 X 欄位:
- 第一字節格式:110xxxxx → 11000010
- 第二字節格式:10xxxxxx → 10000000
以上就是整個 UT8 轉換的過程。