今天參考這篇文章中 ToNum() 的作法寫成了 UAO-Big5 → Unicode 的轉換,程式如下:
private static string uao_b2u(string big5_text)
{
StringBuilder ret = new StringBuilder();
string big5 = "\xEEB8\xEEB9\xEEBA\xEEBB\xEEBC"; //Big5 字碼表,實際程式中非常長……
string unicode = "\x4E17\x4E22\x4E2C\x4E55\x4E62"; //對應的 Unicode 字碼表
for ( int i = 0 ; i < big5_text.Length ; i++ )
{
int index = big5.IndexOf( big5_text[i] );
if ( index >= 0 )
{
ret.Append( unicode[index] );
}
else
{
ret.Append( big5_text[i] );
}
}
return ret.ToString();
}
效率不差,讀取圖中的檔案(6280字)並轉換為 Unicode 一點也沒有延遲感。
接下來紀錄製作過程。
首先,我昨天就知道 C# 會自動轉換非 Big5 字區的文字,因此今天必須想辦法找出這些文字轉換後的新位置。起初我用平移的方法,這種方法是錯誤的,只能符合一部分文字,後來我想到我可以製作一個包含所有 UAO 新增文字的檔案,交給 C# 去讀,然後我就能知道到底會被轉成什麼了。
想法很簡單,但是要怎麼製作這個檔案花了我兩段時間——我花了一段時間才突然想到可以用 Hex editor 來編輯文字檔,然後再花了一段時間尋找支援貼上功能的 Hex editor ,最後找到了 PSPad 。尋找的過程很盲目,我只是記得免費又強大的文字編輯軟體有 Notepad++ 、 PSPad 這些,就一個一個去試,運氣很好的在第二個就試到 :)
轉兩次的風險是可能有些字元會轉到 65535 以外… 不過我沒有遇到這個問題。有一些字元在製作上面的檔案時就發生了奇怪的問題——存檔後會自動被轉成 0x003F ,但很幸運的是,發生這些問題的字元都是一些不重要的字元,如下所示:
␀ ␁ ␂ ␃ ␄ ␅ ␆ ␇ ␈ ␉ ␊ ␋ ␌ ␍ ␎ ␏ ␐ ␑ ␒ ␓ ␔ ␕ ␖ ␗ ␘ ␙ ␚ ␛ ␜ ␝ ␞ ␟ ␡
最後一個步驟則是刪除重複轉換的字元(在自動轉換時已經轉好的字元),雖然不會造成轉換錯誤,但我想這樣多少能提昇一些效率吧!經過刪減後,現在只有 6011 5956 個字元需要轉換1。
-
剛才重新作了一次「製作字碼表 → 轉換 → 刪除重複區段」步驟,將表刪到只剩 5956 個字元,這次採取程式自動刪除,因此應該是相當完美的結果。 ↩
