CE101
用圖解與練習理解字元編碼
用 Excel 打開 CSV,日文內容全變成「縺薙s縺ォ縺。縺ッ」。郵件的主旨變成一串符號。存進資料庫的名字變成「????」— 亂碼明明是家常便飯,但被問到原因時卻意外地難以說明。本課程的目標不是死背處置方法,而是讓你看到亂掉的畫面時,能自己推理出「這是用哪種編碼寫入的位元組序列,被當成了哪種編碼來讀取」。先用圖掌握機制,再親手組出 UTF-8 的位元組序列,最後以貼近實務的亂碼案例做推理收尾。
圖 → 號碼 → 位元組序列 → 推理
共 43 題
瀏覽器內評分
localStorage 儲存
所需時間
3〜4 小時
題目數
共 43 題
形式
7 章 + 小題 + 模擬器
費用
免費
檔案的實體只有位元組序列,並沒有掛著「這是什麼編碼」的標籤。同一串位元組,讀法不同就會看成不同的字元 — 這一張圖是整個課程的出發點。
本課程的特色
正文下方緊接小題
採用讀完馬上解 1〜3 題的結構,讓你不容易在「自以為懂了」的狀態下往前跳。
親手組出 UTF-8
日文字元「あ」U+3042 變成 E3 81 82 這 3 個位元組的過程,會由你自己以位元填入的方式親手計算。
位元組序列模擬器
在第 3 章的模擬器輸入任何字串,就能親眼確認碼位、UTF-8 位元組序列、UTF-16 碼元,甚至「被當成 Shift_JIS 誤讀後的模樣」。
瀏覽器內評分、無需註冊
全部 43 題都在瀏覽器內評分,結果只儲存在你瀏覽器的 localStorage,不會送出任何資料到伺服器。
貫穿本課程的一種觀點
字元在電腦內部永遠以 2 個階段來處理。學會把這 2 個階段分開思考,就是本課程的全部。
第 1 階段:號碼(碼位)
由字元集決定哪個字元編上哪個號碼。在 Unicode 中,日文字元「あ」= U+3042。(第 2 章)
第 2 階段:位元組序列(編碼)
由編碼決定如何把號碼變成位元組序列。以 UTF-8 而言,U+3042 → E3 81 82。(第 3〜5 章)
亂碼的固定套路
檔案上沒有掛著編碼的標籤,所以「寫入的編碼」與「讀取的編碼」一旦錯位,看起來就是別的字元。(第 1、6、7 章)
本課程的口訣:看到亂碼時,不要就此停止思考,請問自己 — 這是用哪種編碼寫入的位元組序列,被當成了哪種編碼來讀取?
章節構成
1 導入 — 亂碼為什麼會發生
5 題。掌握檔案的實體只有位元組序列、同一串位元組換個讀法會變成別的字元,以及字元集與編碼的區別。
2 從 ASCII 到 Unicode — 為字元編上號碼
6 題。從 7 位元的 ASCII,經過日文字元集的百家爭鳴,到為世界上所有字元編上唯一號碼的 Unicode。也會練習 U+XXXX 表示法的讀法。
3 親手組出 UTF-8
6 題。學習可變長度的規則,實際手算把 U+3042 變成 E3 81 82。包含 ASCII 相容為什麼有效與 BOM,附模擬器。
4 Shift_JIS 與日文的歷史包袱 — 地雷字元與 CP932
6 題。從第 2 位元組侵入 ASCII 區域的結構推導出「地雷字元」問題,涵蓋半形片假名、CP932,以及它至今仍在服役的原因。
5 UTF-16 與代理對 — 字元數的陷阱
6 題。追蹤「𠮷」與表情符號變成 2 個碼元的機制,用計算確認 length 為什麼與肉眼所見的字元數不一致。
6 實務上的陷阱 — 讓宣告與實體一致
6 題。charset 宣告與實體不一致、Excel 與帶 BOM 的 UTF-8、換行字元、資料庫的連線設定 — 把現場的經典問題一次盤點。
7 綜合演習 — 推理亂碼的成因
8 題。把「縺薙s縺ォ縺。縺ッ」「ã“ã‚“…」等經典模式當成指紋來讀,以貼近實務的案例橫跨全部章節。
學習訣竅
- 請按照正文 → 緊接其後的小題的順序進行。與其累積到最後再解題,讀完立刻解題更容易記住。
- 第 3 章的位元填入,請務必在紙上寫下二進位親手操作。只要自己推導過一次 E3 81 82,UTF-8 就會從「背誦科目」變成「可以計算的東西」。
- 請在第 3 章的模擬器輸入自己的名字或工作上會處理的字串。位元組數與字元數的落差會變成親身體感。
- 在第 7 章的案例題卡關時,只要回到對應的章節複習 1〜2 輪即可,不需要整個重來。
開始前的前提
- 只要有處理過文字檔或 CSV 的經驗就足夠。不要求程式設計經驗。
- 十六進位只需要「用 0〜9 與 A〜F 表示數字的寫法」這種程度的前提,讀法會在章節中練習。
- 二進位與十六進位的相互轉換(4 個位元 = 十六進位 1 位數)只在第 3 章用到,正文中會穿插複習。