該「死」的 Big5HKSCS
當初 Roger So 說 Big5HKSCS 應該快點死掉才好,當時不明所以,現在充分感受到了。
我在中文維基中寫過 glibc 的 Big5HKSCS 版本實在是太舊了,甚至和日常用的 Big5 不兼容。大致上也可以估到,glibc 中 Big5HKSCS 的 Big5 部份是取自 80 年代已經超級過時的 Big5 碼表,即使是 Big5 本身也修訂過,但 glibc 的 Big5HKSCS 卻一直未更新過。舉個例子,兩個 Big5 中都有的符號,由 Big5 轉換至 Unicode,和由 Big5HKSCS 轉換至 Unicode 的結果不一樣:
| Byte Sequence | 0xA1FE | 0xA241 |
|---|---|---|
| Big5 → Unicode | / (U+FF0F) |
∕ (U+2215) |
| Big5HKSCS → Unicode | 轉換錯誤 | / (U+FF0F) |
U+2215 和 U+FF0F 在 Unicode 的解釋分別為 DIVISION SLASH 和 FULL WIDTH SOLIDUS,前者用於算式,後者是 ASCII 的斜號的全形版本。在 Unicode 中後者是全形但前者不是。
目前我正在寫個小小的 script,將使用舊版 HKSCS (Big5HKSCS 或 UTF-8) 的文字檔轉換至使用 HKSCS-2004 的 UTF-8 編碼,主要關鍵是舊版ISO 10646 將不少香港字分配至造字區 (PUA, Private Use Area),但 ISO10646:2003 已經將絕大部份的字搬到造字區以外的正式區域,所以盡量將這些字的碼位更新。但沒想到困難重重,至少 glibc 的舊版 HKSCS 就使得我不能信任 iconv (和 Perl 的 iconv module),要另找方法檢查檔案編碼是否合法的 Big5HKSCS 了。幸好,Perl 的 Encode module 有較正確的 Big5HKSCS 碼表:
| Byte Sequence | 0xA1FE | 0xA241 |
|---|---|---|
| Big5 → Unicode | / (U+FF0F) |
∕ (U+2215) |
| Big5HKSCS → Unicode |
晚上 10 時更新:這個 script 已經放上網了。