S-CODE

這是一個四字元的內碼系統. 我知道其實早已有別人作這樣的設計, 甚至六個到八個字元的內碼系統都有. 但是, 我無從得知那些內碼系統的設計細節. 可能是因為我不是這一類題目的專家吧, 我不知道哪裡去找這些文獻. 總之, 我只是想讓我自己或我的學生寫的程式有某種共通的內碼, 以免將來重複浪費精力, 所以只要我自個兒認為可用也就好了, 無須太在意別人的內碼系統.

此四個字元湊在一起, 組成一個整數. 也就是說, 它的數值在 -2^31..2^31-1 之間. 其中若沒有中國字碼發生的時候, 這個整數值應與 Latin-1 或 ASCII 相容; 例如 NULL 仍是 0, EOF 仍是 -1.

我們稱這四個字元為 t, s, x, y. 當 s=0 我們將要存放 ASCII 或 Latin-1 (此二者是相容的) 碼. 為了與一般慣用的 NULL, EOF 等定義相容, 我們應該設定當 s=0 的時候就一定 t=0 且 x=0. 所以整個 S-code 的整數值就是 y 的值, 亦即 Latin-1 碼號. 也就是說, 當 y 在 0..127 之間, 就是 ASCII 碼; 當 y 在 161..255 之間, 就是 Latin-1 碼.

當 s > 0, 代表是 CNS 的第 s 字面的編碼. 此時 (x,y) 就是 CNS 的碼. 依據 1992 年 5 月 21 日頒佈的 CNS 11643 X5012 標準, 共準備了十六個字面. 所以我們將介於 1..16 之間的 s 保留給 CNS 碼, 但以後仍可能加上其他的代號, 例如簡體字的國標碼, 日本韓國等其他外國碼, 或是 unicode 的一部份. 為了在直接輸出 S-code 時的方便, 我們要 s=0 的值輸出 '0' 字元, s=1 的值輸出 '1' 字元, 依此類推. 而又要輸出 ASCII 的可印字元, 故最大的 s 值是 126 - '0' = 78. 暫時我們這樣設計足夠用了. 現在我們已經將這個數字保留給 CNS 第一字面的符號區域; 也就是說, 當 s = 78 時, (x,y) 代表一個二位元寬的符號.

但我們保留 s 的二進制格式是 11111111 且 t=x=y=0 的情形, 定義成常數 S_FAIL. 這種情形, 也就是 S-code 的值是 16711680 的時候, 代表轉換失敗. 可能是輸入的碼有問題, 要不就是輸入碼的類別弄錯了, 否則可能碰到了 CNS 沒有定義的字或符號. 使用者必須自行判斷如何處理這種情況.

CNS 的第一字面中有一些符號. 我們用保留 s 的整數值為 78 的數, 作為符號字面 (也就是說, 把第一字面拆成兩份). 為了某些動作的需求, 我們利用 t 來加註一些符號的性質. 以下我們列出 t 所代表的特殊意義.

hexadecimalsymbolmeaning
01WHITE空白字元
02GENERAL一般符號
03TABLE表格符號
04PUNRF橫排前置符號
05PUNRL橫排後置符號
06PUNCF直排前置符號
07PUNCL直排後置符號
08MATH數學符號
09MATHF數學前置符號
0AMATHL數學後置符號
0BNUMO序號圈
0CNUMK序號括
10ZHUYIN注音符號
11TONE聲調符號
20ROMCAP羅馬數字大寫
21ROMLIT羅馬數字小寫
30NUMARB阿拉伯數字
40UNIT數學單位符號
50ENGCAP英國大寫字母
51ENGLIT英國小寫字母
52GRKCAP希臘大寫字母
53GRKLIT希臘小寫字母
60BUSHOU部首
70ASCIIASCII 0..31, 127 代表符號

當 s=1 時, 代表在第一字面的中文文字部分. 注意我們把全形的阿拉伯數目字當作符號, 而中文數目字一到十當作文字. 這是因循原來 CNS 字集的設計方式. 此後 s=2..16 都保留來代表 CNS 的第 s 字面. 目前, 對應這些 s 值都沒有特殊的 t 值, 先定成零. 但是我考慮應把 t 值設成有利於不同字面之間的字作排序 (sorting) 時有用的輔助資料, 例如筆畫數或某種第 s+1 字面對於第 s 字面的 offset. 但因排序未必時常會發生, 而且加上這些輔助資料時勢必減緩轉換的速度, 是否值得, 還有待觀察.

所有用到 s, t 特殊意義的程式, 都應該不直接寫在應用程式內, 而是呼叫一個類似 ctype 的程式來處理, 這樣以後修改 S-code 定義的時候才不會出錯.


Created: Dec 27, 1995
Last Revised: Jan 20, 1996
© Copyright 1995, 1996 Wei-Chang Shann

shann@math.ncu.edu.tw