This commit is contained in:
krahets
2026-04-10 22:40:59 +08:00
parent 5747b4377b
commit 1697615483
56 changed files with 61 additions and 66 deletions
@@ -4445,9 +4445,8 @@
<h2 id="343-unicode">3.4.3 &nbsp; Unicode 字元集<a class="headerlink" href="#343-unicode" title="Permanent link">&para;</a></h2>
<p>隨著計算機技術的蓬勃發展,字元集與編碼標準百花齊放,而這帶來了許多問題。一方面,這些字元集一般只定義了特定語言的字元,無法在多語言環境下正常工作。另一方面,同一種語言存在多種字元集標準,如果兩臺計算機使用的是不同的編碼標準,則在資訊傳遞時就會出現亂碼。</p>
<p>那個時代的研究人員就在想:<strong>如果推出一個足夠完整的字元集,將世界範圍內的所有語言和符號都收錄其中,不就可以解決跨語言環境和亂碼問題了嗎</strong>?在這種想法的驅動下,一個大而全的字元集 Unicode 應運而生。</p>
<p><u>Unicode</u> 的中文名稱為“統一碼”,理論上能容納 100 多萬個字元。它致力於將全球範圍內的字元納入統一的字元集之中,提供一種通用的字元集來處理和顯示各種語言文字,減少因為編碼標準不同而產生的亂碼問題。</p>
<p>自 1991 年釋出以來,Unicode 不斷擴充新的語言與字元。截至 2022 年 9 月,Unicode 已經包含 149186 個字元,包括各種語言的字元、符號甚至表情符號等。在龐大的 Unicode 字元集中,常用的字元佔用 2 位元組,有些生僻的字元佔用 3 位元組甚至 4 位元組。</p>
<p>Unicode 是一種通用字元集,本質上是給每個字元分配一個編號(稱為“碼點”),<strong>但它並沒有規定在計算機中如何儲存這些字元碼點</strong>。我們不禁會問:當多種長度的 Unicode 碼點同時出現在一個文字中時,系統如何解析字元?例如給定一個長度為 2 位元組的編碼,系統如何確認它是一個 2 位元組的字元還是兩個 1 位元組的字元?</p>
<p><u>Unicode</u> 的中文名稱為“統一碼”,理論上能容納 100 多萬個字元。它致力於將全球範圍內的字元納入統一的字元集之中,提供一種通用的字元集來處理和顯示各種語言文字,減少因為編碼標準不同而產生的亂碼問題。自 1991 年釋出以來,Unicode 不斷擴充新的語言與字元。截至 2022 年 9 月,Unicode 已經包含 149186 個字元,包括各種語言的字元、符號甚至表情符號等。</p>
<p>Unicode 作為一種通用字元集,本質上是給每個字元分配唯一的“碼點”(字元編號),其取值範圍為 U+0000 至 U+10FFFF,構成了統一的字元編號空間。然而,<strong>Unicode 並沒有規定在計算機中如何儲存這些字元碼點</strong>。我們不禁會問:當多種長度的 Unicode 碼點同時出現在一個文字中時,系統如何解析字元?例如給定一個長度為 2 位元組的編碼,系統如何確認它是一個 2 位元組的字元還是兩個 1 位元組的字元?</p>
<p>對於以上問題,<strong>一種直接的解決方案是將所有字元儲存為等長的編碼</strong>。如圖 3-7 所示,“Hello”中的每個字元佔用 1 位元組,“演算法”中的每個字元佔用 2 位元組。我們可以透過高位填 0 將“Hello 演算法”中的所有字元都編碼為 2 位元組長度。這樣系統就可以每隔 2 位元組解析一個字元,恢復這個短語的內容了。</p>
<p><img alt="Unicode 編碼示例" class="animation-figure" src="../character_encoding.assets/unicode_hello_algo.png" /></p>
<p align="center"> 圖 3-7 &nbsp; Unicode 編碼示例 </p>