最近利用 gcin 的倉頡對照表寫了一個小程序。( 簡單來說就是一個 CLI 的倉頡轉換器 )
為什麼要做這個東西呢?當然這是為了可以在公司寫 blog 而不被人發現啊!想想如果明目張膽地於眾目睽睽之下打那麼多中文字,這很快就會被發現吧!
嘛,愉懶的事情先到這裏,今天想討論一下能將對照表編譯為源碼的技術。
對照表轉換的我在制作 wenku8 app 的時候,其中一環需為港台網民制作 簡=>繁 轉換1。
由於簡繁不能直接對照2,於是我找到了新同文堂的對照表,然後花了整整兩天時間將編譯方法苦了出來。
記得當時是基於效能問題得利用 C ++ 編寫這個程序,因為每篇文章可能有幾萬字,而每個中文字則有 4~6 個字節,轉換列表又有一萬多行,再加上轉換量,用 replace 實在不怎麼說得通。
於是我就寫起來了,在網上問到了「最快3」的轉換方法4後,剛剛開始寫的時候是這麼做的:
if( strcmp(str, "0海里") == 0 )
{
out = "0海里";
step_size = 8;
}
else if ( strcmp(str, "0天后") == 0 )
{
out = "0天後";
step_size = 8;
}
...
if( str[start + 0] == 239 && str[start + 1] == 188 )
{
if( str[start + 2] == 144 )
{
if( str[start + 3] == 232 && str[start + 4] == 163 && str[start + 5] == 161 )
{
out = "0里";
step_size = 5;
}
else if ( str[start + 3] == 230 && str[start + 4] == 181 && str[start + 5] == 183 )
{
if( str[start + 6] == 232 && str[start + 7] == 163 && str[start + 8] == 161 )
{
out = "0海里";
step_size = 8;
}
if( step_size == 0 )
{
out = "0海";
step_size = 5;
}
}
else if ( str[start + 3] == 228 && str[start + 4] == 189 && str[start + 5] == 153 )
{
out = "0餘";
step_size = 5;
}
}
...
// 以下三個字組有相同的F值(239),因此239為一個判定。
// 下面在細字子字組,如此類推。
// 239 240 221
// 239 241
// 239 250
if( 239 )
{
if ( 240 && 221 )
{
// output
}
else if( 241 )
{
...
}
else if( 250 )
.
.
.
}
...
不干, 不干
不干不淨, 不乾不淨
不干他, 不干他
不干休, 不干休
不干你, 不干你
if( 不干 )
{
if ( 不淨 )
{
// 不乾不淨
step_size = 8;
}
else if ( 他 )
{
// 不干他
step_size = 6;
}
...
// 這裏判定如沒有接續
if ( step_size = 0 )
{
// 不干
}
}