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 編碼點轉換成二進位數據涉及以下步驟:

  1. Unicode 編碼點:例如 U+0041。
  2. 轉換成二進位:首先將十六進位數字轉換成二進位。
編碼點 十六進位 二進位
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 轉換的過程。

Similar Posts