以數碼方式表示文字
歡迎!你有沒有想過,電腦究竟是如何知道你在鍵盤上輸入了甚麼字母?無論你是在發訊息給朋友、寫作文,還是在網上搜尋資料,電腦每秒鐘都在處理數以百萬計的字詞。但這裡有一個大秘密:電腦其實完全無法直接閱讀或理解字母。在微晶片深處,電腦是由極微小的電子開關(晶體管)所組成的,它們只能理解兩種狀態:開(on)或關(off)。在電腦科學中,我們使用二進制數字 \(0\) 和 \(1\) 來表示這些狀態。
那麼,電腦是如何將像 \(01000001\) 這樣的二進制數字轉換成英文字母 A 的呢?在這一章中,你將會學到電腦科學家所發明的精妙系統——如何僅僅使用二進制數字來表示人類的文字!
如果一開始覺得二進制數字有點陌生,不用擔心——讀完這份學習筆記後,你會發現它就像密碼解讀一樣簡單有趣!
---1. 基礎概念:字符與字符集
甚麼是字符(Character)?
在電腦科學中,字符是書寫資訊的單一單位。字符可以是:
• 大寫字母(例如 A、B、C)
• 小寫字母(例如 a、b、c)
• 數字(例如 0、1、2 ... 9)
• 標點符號(例如 .、!、?、,)
• 特殊符號(例如 £、$、%、+)
• 空格(按下鍵盤的空白鍵其實也創建了一個真實的字符!)
• 控制碼(看不見的指令,例如按下 Enter/Return、Backspace 或 Escape)
甚麼是字符集(Character Set)?
想像一下你和朋友有一套秘密解碼器,每個字母都分配了一個專屬數字:\(1 = A\)、\(2 = B\)、\(3 = C\),以此類推。如果你傳送數字 \(8 - 5 - 12 - 12 - 15\) 給朋友,他們就能解碼讀出 HELLO。
在電腦科學中,這套解碼器就被稱為字符集。字符集是一個預先定義且標準化的清單,列出了電腦系統能夠識別的所有字符,其中每一個字符都會被賦予一個獨一無二的數值,稱為字符編碼(character code,或稱碼位 code point)。
狀態數量公式
電腦究竟可以儲存多少個不同的字符?這完全取決於我們為每個編碼使用多少個二進制位元(bits)!
每當你增加 \(1\) 個額外的位元,可以表示的字符數量就會翻倍。其數學公式為:
獨特字符的數量 \(= 2^n\)
(其中 \(n\) 為每個字符所使用的位元數目)
• 使用 \(1\) 個位元:\(2^1 = 2\) 個字符(\(0\) 或 \(1\))
• 使用 \(2\) 個位元:\(2^2 = 4\) 個字符(\(00\)、\(01\)、\(10\)、\(11\))
• 使用 \(3\) 個位元:\(2^3 = 8\) 個字符(\(000\) 至 \(111\))
• 使用 \(7\) 個位元:\(2^7 = 128\) 個字符
• 使用 \(8\) 個位元:\(2^8 = 256\) 個字符
重點歸納:字符集是一個完整的字符清單,將字符與專屬的二進制數字配對,讓電腦可以儲存並顯示文字。
---2. ASCII 標準
甚麼是 ASCII?
在電腦發展初期,不同品牌的電腦都使用各自的自訂編碼。在一部電腦上編寫的檔案,在另一部電腦上開啟時可能會變成亂碼!為了解決這個問題,科學家創立了一個通用的標準,稱為 ASCII(讀音為 "ASK-ee"),即美國資訊交換標準代碼(American Standard Code for Information Interchange)。
標準 7 位元 ASCII
• 每個字符使用 \(7\) 個位元。
• 可以表示 \(2^7 = 128\) 個不同的字符(使用的字符編碼從 \(0\) 到 \(127\))。
• 包括所有英文字母大寫(\(A\)–\(Z\))、小寫(\(a\)–\(z\))、數字(\(0\)–\(9\))、常用標點符號、空格,以及退格(Backspace)和換行(Enter)等控制字符。
擴充 8 位元 ASCII(Extended ASCII)
隨著電腦功能變得更強大,系統轉為使用完整的 \(8\) 位元字節(其中 \(1\text{ byte 字節} = 8\text{ bits 位元}\))。
• 每個字符使用 \(8\) 個位元。
• 可以表示 \(2^8 = 256\) 個不同的字符(使用的字符編碼從 \(0\) 到 \(255\))。
• 額外的 \(128\) 個編碼(從 \(128\) 到 \(255\))讓擴充 ASCII 能夠加入歐洲語言的變音字母(例如 é、ñ)、額外的貨幣符號(例如 £),以及基本的繪圖線條符號。
ASCII 的邏輯順序(定序 Collation)
ASCII 的設計非常巧妙!字符是按照連續且符合邏輯的數值順序排列的,這使電腦能夠非常輕鬆地將字詞按字母順序排列。
以下是你應該記住的關鍵參考數值:
• 大寫字母 'A' 的十進制編碼是 \(65\)(二進制為 \(01000001\))。
• 'B' 是 \(66\),'C' 是 \(67\) ... 一直排到 'Z' 是 \(90\)。
• 小寫字母 'a' 的十進制編碼是 \(97\)(二進制為 \(01100001\))。
• 'b' 是 \(98\),'c' 是 \(99\) ... 一直排到 'z' 是 \(122\)。
• 數字從 '0' 開始,編碼為 \(48\),'1' 是 \(49\) ... 直到 '9' 是 \(57\)。
實用小貼士:神奇數字 32
留意一下大寫字母與小寫字母之間的差異:
\(\text{'a' 的編碼} - \text{'A' 的編碼} = 97 - 65 = 32\)
要將任何 ASCII 大寫字母轉換為小寫字母,只需將其十進制編碼加上 \(32\)!在二進制中,這純粹代表將第 \(6\) 個位元從 \(0\) 翻轉為 \(1\)。
ASCII 的局限性
雖然 ASCII 對於英文運作良好,但它有一個致命的缺點:容量實在太小了。由於只有 \(128\) 或 \(256\) 個可能的編碼,ASCII 無法表示擁有龐大字符系統或非拉丁字母的世界語言(例如中文、日文、阿拉伯文和俄文),亦無法支援像 Emoji 這樣的現代符號。
重點歸納:標準 ASCII 使用 \(7\) 個位元(\(128\) 個字符),而擴充 ASCII 使用 \(8\) 個位元(\(256\) 個字符)。它能很好地支援英文,但無法支援世界上所有的語言。
---3. Unicode(統一碼)標準:全球適用的解決方案
為甚麼要創立 Unicode?
為了解決 ASCII 的局限,電腦科學家創立了 Unicode(統一碼)。Unicode 的目標是建立一個單一且通用的字符集,能夠表示地球上所有人類書寫的語言、數學及科學符號、古代文字以及現代的 Emoji 表情符號。
Unicode 的容量有多大?
Unicode 使用更大的位元深度——通常每個字符使用高達 \(16\) 個位元或 \(32\) 個位元(透過 UTF-8、UTF-16 和 UTF-32 等編碼格式):
• \(16\) 位元編碼可提供 \(2^{16} = 65,536\) 個獨特字符。
• \(32\) 位元編碼可提供超過 \(40\text{ 億}\) 個字符(\(2^{32} = 4,294,967,296\) 個可能的碼位)。
你知道嗎?由於容量極其龐大,Unicode 擁有充足的空間容納數以千計的 Emoji,從笑臉 😊 到動物 🐼 乃至食物 🍕 應有盡有!
向後兼容性(Backward Compatibility)
Unicode 最出色的設計之一在於它對 ASCII 具有向後兼容性。這代表 Unicode 中的前 \(128\) 個編碼(編碼 \(0\) 到 \(127\))與標準 \(7\) 位元 ASCII 完全相同。任何現代的 Unicode 系統都可以完美無誤地讀取傳統的 ASCII 檔案。
ASCII 與 Unicode 的比較
• ASCII:每個字符使用 \(7\) 或 \(8\) 個位元。可儲存 \(128\) 至 \(256\) 個字符。僅涵蓋英文及少數西歐字符。檔案佔用的儲存空間較小。
• Unicode:每個字符使用高達 \(16\) 或 \(32\) 個位元。可儲存數以百萬計甚至數以十億計的字符。涵蓋全球所有語言、數學符號及 Emoji。使用較大位元深度時,每個字符需要較多的儲存空間。
重點歸納:Unicode 是現代的全球標準。它能儲存數以十億計的字符,支援世界上所有主要語言和 Emoji,同時保持與舊式 ASCII 文字的兼容性。
---4. 計算純文字檔案的大小
因為每個字符都需要特定數量的位元,所以計算純文字檔案(plain text file)的儲存大小非常直接簡單。
儲存容量計算公式
$$\text{檔案大小 (bits)} = \text{字符總數} \times \text{每個字符的位元數}$$
記住:你必須計算所有的字母、數字、標點符號,以及空格!
範例一:擴充 ASCII(每個字符 \(8\) 個位元)
假設你寫了一句簡短的訊息:"Hello World!"
步驟 1:計算所有字符的數量:
H-e-l-l-o(\(5\))+ [空格](\(1\))+ W-o-r-l-d-!(\(6\))\(= \text{總共 } 12\text{ 個字符}\)。
步驟 2:乘以每個字符的位元數(擴充 ASCII 為 \(8\text{ bits}\)):
\(\text{檔案大小 (bits)} = 12 \times 8 = 96\text{ bits}\)
步驟 3:轉換為字節 Byte(將位元數除以 \(8\)):
\(\text{檔案大小 (bytes)} = \frac{96}{8} = 12\text{ bytes}\)
留意一個實用法則:在 \(8\) 位元的擴充 ASCII 中,\(1\text{ 個字符} = 1\text{ 個字節 (byte)}\)。因此 \(100\text{ 個字符} = 800\text{ bits} = 100\text{ bytes}\)。
範例二:\(16\) 位元 Unicode
如果一個包含 \(100\text{ 個字符}\) 的文字檔案以 \(16\) 位元 Unicode 編碼儲存,大小是多少?
• \(\text{檔案大小 (bits)} = 100 \times 16 = 1,600\text{ bits}\)
• \(\text{檔案大小 (bytes)} = \frac{1,600}{8} = 200\text{ bytes}\)
由於每個字符使用 \(16\text{ bits}\)(\(2\text{ bytes}\)),因此該檔案佔用的儲存空間是 \(8\) 位元 ASCII 檔案的兩倍。
重點歸納:文字檔案大小等於字符數量乘以位元深度。千萬不要忘記計算空格和標點符號!
---5. 常見錯誤與迷思
在回答有關數碼文字表示法的問題時,要特別留意以下常見陷阱:
錯誤 1:忘記空格和標點符號也會佔用儲存空間
糾正:空格、逗號、問號和換行符號都是字符!每個空格都像字母一樣,需要自己的字符編碼和二進制儲存空間。
錯誤 2:混淆數值 \(7\) 與文字字符 '7'
糾正:當以二進制純數值儲存時,十進制數字 \(7\) 是 \(00000111\)。然而,在鍵盤上輸入的文字字符 '7',其 ASCII 字符編碼則是十進制的 \(55\)(二進制為 \(00110111\))。
錯誤 3:以為 'A' 和 'a' 共用相同的二進制編碼
糾正:電腦將大寫字母和小寫字母視為完全不同的字符,並分配不同的編碼('A' 是 \(65\);'a' 是 \(97\))。
錯誤 4:以為 ASCII 和 Unicode 會儲存字型樣式、顏色或大小
糾正:字符集只負責編碼出現的是哪一個字母或符號。文字格式(例如粗體、斜體、字型或文字顏色)是由文件標記或文書處理軟件另行儲存的。
錯誤 5:以為 Unicode 只能儲存字母文字
糾正:Unicode 還包含了數學符號、科學記號、古代符號、方向控制標記以及 Emoji 表情符號!
6. 本章重點快速複習
讓我們透過這份快速摘要清單來檢查你的理解程度:
✔ 電腦的二進制本質:電腦只能處理電壓訊號的 \(0\) 和 \(1\)。
✔ 字符集(Character Set):將每個字符與專屬數值編碼關聯起來的標準化對照表。
✔ \(7\) 位元 ASCII:可儲存 \(2^7 = 128\) 個字符(英文字母、數字、基本標點、控制碼)。
✔ \(8\) 位元擴充 ASCII:可儲存 \(2^8 = 256\) 個字符(加入了歐洲語言變音符號及額外符號)。
✔ 必記的 ASCII 數值:'A' \(= 65\)、'a' \(= 97\)、'0' \(= 48\)。(大寫轉小寫:加上 \(32\))。
✔ Unicode(統一碼):支援高達 \(16\) 或 \(32\) 個位元(數以十億計的字符),涵蓋全球所有語言及 Emoji;向後兼容 ASCII。
✔ 檔案大小:\(\text{檔案大小 (bits)} = \text{字符數量} \times \text{每個字符的位元數}\)。