Bug fixes and improvements. (#1780)

* Fix the "尾递归优化" to "递归深度优化" in quick_sort.

* Update landing pages.

* Sync zh and zh-hant versions.

* Sync zh and zh-hant versions.
This commit is contained in:
Yudong Jin
2025-07-10 06:32:25 +08:00
committed by GitHub
parent 6a4d62449c
commit e8dc4736a2
43 changed files with 173 additions and 165 deletions

View File

@ -1,34 +1,34 @@
# 字元編碼 *
在計算機中,所有資料都是以二進位制數的形式儲存的,字元 `char` 也不例外。為了表示字元,我們需要建立一套“字集”,規定每個字元和二進位制數之間的一一對應關係。有了字集之後,計算機就可以透過查表完成二進位制數到字元的轉換。
在計算機中,所有資料都是以二進位制數的形式儲存的,字元 `char` 也不例外。為了表示字元,我們需要建立一套“字集”,規定每個字元和二進位制數之間的一一對應關係。有了字集之後,計算機就可以透過查表完成二進位制數到字元的轉換。
## ASCII 字
## ASCII 字
<u>ASCII 碼</u>是最早出現的字集,其全稱為 American Standard Code for Information Interchange美國標準資訊交換程式碼。它使用 7 位二進位制數(一個位元組的低 7 位)表示一個字元,最多能夠表示 128 個不同的字元。如下圖所示ASCII 碼包括英文字母的大小寫、數字 0 ~ 9、一些標點符號以及一些控制字元如換行符和製表符
<u>ASCII 碼</u>是最早出現的字集,其全稱為 American Standard Code for Information Interchange美國標準資訊交換程式碼。它使用 7 位二進位制數(一個位元組的低 7 位)表示一個字元,最多能夠表示 128 個不同的字元。如下圖所示ASCII 碼包括英文字母的大小寫、數字 0 ~ 9、一些標點符號以及一些控制字元如換行符和製表符
![ASCII 碼](character_encoding.assets/ascii_table.png)
然而,**ASCII 碼僅能夠表示英文**。隨著計算機的全球化,誕生了一種能夠表示更多語言的 <u>EASCII</u>集。它在 ASCII 的 7 位基礎上擴展到 8 位,能夠表示 256 個不同的字元。
然而,**ASCII 碼僅能夠表示英文**。隨著計算機的全球化,誕生了一種能夠表示更多語言的 <u>EASCII</u>集。它在 ASCII 的 7 位基礎上擴展到 8 位,能夠表示 256 個不同的字元。
在世界範圍內,陸續出現了一批適用於不同地區的 EASCII 字集。這些字集的前 128 個字元統一為 ASCII 碼,後 128 個字元定義不同,以適應不同語言的需求。
在世界範圍內,陸續出現了一批適用於不同地區的 EASCII 字集。這些字集的前 128 個字元統一為 ASCII 碼,後 128 個字元定義不同,以適應不同語言的需求。
## GBK 字
## GBK 字
後來人們發現,**EASCII 碼仍然無法滿足許多語言的字元數量要求**。比如漢字有近十萬個,光日常使用的就有幾千個。中國國家標準總局於 1980 年釋出了 <u>GB2312</u>集,其收錄了 6763 個漢字,基本滿足了漢字的計算機處理需要。
後來人們發現,**EASCII 碼仍然無法滿足許多語言的字元數量要求**。比如漢字有近十萬個,光日常使用的就有幾千個。中國國家標準總局於 1980 年釋出了 <u>GB2312</u>集,其收錄了 6763 個漢字,基本滿足了漢字的計算機處理需要。
然而GB2312 無法處理部分罕見字和繁體字。<u>GBK</u>集是在 GB2312 的基礎上擴展得到的,它共收錄了 21886 個漢字。在 GBK 的編碼方案中ASCII 字元使用一個位元組表示,漢字使用兩個位元組表示。
然而GB2312 無法處理部分罕見字和繁體字。<u>GBK</u>集是在 GB2312 的基礎上擴展得到的,它共收錄了 21886 個漢字。在 GBK 的編碼方案中ASCII 字元使用一個位元組表示,漢字使用兩個位元組表示。
## Unicode 字
## Unicode 字
隨著計算機技術的蓬勃發展,字集與編碼標準百花齊放,而這帶來了許多問題。一方面,這些字集一般只定義了特定語言的字元,無法在多語言環境下正常工作。另一方面,同一種語言存在多種字集標準,如果兩臺計算機使用的是不同的編碼標準,則在資訊傳遞時就會出現亂碼。
隨著計算機技術的蓬勃發展,字集與編碼標準百花齊放,而這帶來了許多問題。一方面,這些字集一般只定義了特定語言的字元,無法在多語言環境下正常工作。另一方面,同一種語言存在多種字集標準,如果兩臺計算機使用的是不同的編碼標準,則在資訊傳遞時就會出現亂碼。
那個時代的研究人員就在想:**如果推出一個足夠完整的字集,將世界範圍內的所有語言和符號都收錄其中,不就可以解決跨語言環境和亂碼問題了嗎**?在這種想法的驅動下,一個大而全的字集 Unicode 應運而生。
那個時代的研究人員就在想:**如果推出一個足夠完整的字集,將世界範圍內的所有語言和符號都收錄其中,不就可以解決跨語言環境和亂碼問題了嗎**?在這種想法的驅動下,一個大而全的字集 Unicode 應運而生。
<u>Unicode</u> 的中文名稱為“統一碼”,理論上能容納 100 多萬個字元。它致力於將全球範圍內的字元納入統一的字集之中,提供一種通用的字集來處理和顯示各種語言文字,減少因為編碼標準不同而產生的亂碼問題。
<u>Unicode</u> 的中文名稱為“統一碼”,理論上能容納 100 多萬個字元。它致力於將全球範圍內的字元納入統一的字集之中,提供一種通用的字集來處理和顯示各種語言文字,減少因為編碼標準不同而產生的亂碼問題。
自 1991 年釋出以來Unicode 不斷擴充新的語言與字元。截至 2022 年 9 月Unicode 已經包含 149186 個字元,包括各種語言的字元、符號甚至表情符號等。在龐大的 Unicode 字集中,常用的字元佔用 2 位元組,有些生僻的字元佔用 3 位元組甚至 4 位元組。
自 1991 年釋出以來Unicode 不斷擴充新的語言與字元。截至 2022 年 9 月Unicode 已經包含 149186 個字元,包括各種語言的字元、符號甚至表情符號等。在龐大的 Unicode 字集中,常用的字元佔用 2 位元組,有些生僻的字元佔用 3 位元組甚至 4 位元組。
Unicode 是一種通用字集,本質上是給每個字元分配一個編號(稱為“碼點”),**但它並沒有規定在計算機中如何儲存這些字元碼點**。我們不禁會問:當多種長度的 Unicode 碼點同時出現在一個文字中時,系統如何解析字元?例如給定一個長度為 2 位元組的編碼,系統如何確認它是一個 2 位元組的字元還是兩個 1 位元組的字元?
Unicode 是一種通用字集,本質上是給每個字元分配一個編號(稱為“碼點”),**但它並沒有規定在計算機中如何儲存這些字元碼點**。我們不禁會問:當多種長度的 Unicode 碼點同時出現在一個文字中時,系統如何解析字元?例如給定一個長度為 2 位元組的編碼,系統如何確認它是一個 2 位元組的字元還是兩個 1 位元組的字元?
對於以上問題,**一種直接的解決方案是將所有字元儲存為等長的編碼**。如下圖所示“Hello”中的每個字元佔用 1 位元組,“演算法”中的每個字元佔用 2 位元組。我們可以透過高位填 0 將“Hello 演算法”中的所有字元都編碼為 2 位元組長度。這樣系統就可以每隔 2 位元組解析一個字元,恢復這個短語的內容了。
@ -42,7 +42,7 @@ Unicode 是一種通用字符集,本質上是給每個字元分配一個編號
UTF-8 的編碼規則並不複雜,分為以下兩種情況。
- 對於長度為 1 位元組的字元,將最高位設定為 $0$ ,其餘 7 位設定為 Unicode 碼點。值得注意的是ASCII 字元在 Unicode 字集中佔據了前 128 個碼點。也就是說,**UTF-8 編碼可以向下相容 ASCII 碼**。這意味著我們可以使用 UTF-8 來解析年代久遠的 ASCII 碼文字。
- 對於長度為 1 位元組的字元,將最高位設定為 $0$ ,其餘 7 位設定為 Unicode 碼點。值得注意的是ASCII 字元在 Unicode 字集中佔據了前 128 個碼點。也就是說,**UTF-8 編碼可以向下相容 ASCII 碼**。這意味著我們可以使用 UTF-8 來解析年代久遠的 ASCII 碼文字。
- 對於長度為 $n$ 位元組的字元(其中 $n > 1$),將首個位元組的高 $n$ 位都設定為 $1$ ,第 $n + 1$ 位設定為 $0$ ;從第二個位元組開始,將每個位元組的高 2 位都設定為 $10$ ;其餘所有位用於填充字元的 Unicode 碼點。
下圖展示了“Hello演算法”對應的 UTF-8 編碼。觀察發現,由於最高 $n$ 位都設定為 $1$ ,因此系統可以透過讀取最高位 $1$ 的個數來解析出字元的長度為 $n$ 。