拆解 EBWIN
在眾多輕小説翻譯網站關閉了之後,我開始啃生肉了。在即時字典的輔助之下,啃生肉意外地輕鬆。

但因為不是直書( 加上只能看網站所提拱的 web 界面 ),在用 wenku8 看慣了直書的我覺得很不是滋味,於是就做了只蜘蛛直接把書爬下來。

然後蜘蛛做好了,看了十五分鐘發現沒有字典跟本看不懂!再説像這樣兩個 app 之前翻來翻去煩死人了。

於是我決定替這個 app 增加字典功能!

===

研究了兩天,從wiktionary上提取數據是不可行的,那種格式要處理得花很多時間。

於是找找有沒有其它可用的字典格式,種類雖然很多,但有良好的「日日」 /「日中」/「中日」翻譯的字典卻很少。

( babylon 好像有免費字典,github 上有個好像好厲害的轉換器能轉換各種格式。但看到那個分析器的源碼有接近三千行我就不想看了… )

想到以前在工作認識的朋友介紹的字典軟件,叫 EBWING。這個東西是我用過的字典最好用的軟件…不對,應該説他給的那幾本字典好厲害才對。

研究了一會之後發現 eb 系列好像是在日本那邊是厲害的軟件。那麼自然就有ebライブラリー( eb library ) 了!可惜是説明日文,使用的語言是 C ,加上這個原本是做給 GNU 的。所以 dependency 好像也不合。

===

又糾結了一天

===

現在有兩個方案,( 但兩個都不好 )。

1. 讀取 babylon 的 bgl 格式,也就是説解讀那三千行源碼用 C# 重寫一個
2. 將 eb library 移植至 C++/CX 的平台上

我選了第二個,原因是如下:

1. 不肯定提拱 babylon 格式讀取會不會惹 babylon 不高興,這種東西可免則免。
2. 手上有幾個 eb 格式的字典,字典本身非常好用
3. 順便學習寫 C++
4. eb library 是 GNU License

於是今天是移植開始的第二天,進度良好。

在分析 EB Library 後,當前的問題

説起來當初直接打開字典文件來看的時候根本看不懂啊,之前也嘗試過直接使用這個 library ,結果失敗了幾次。但在我下定決心移植並深入了解源碼之後,發現了 C 的處理方式跟 C++ 不同,又發現 C++/CX 又跟一般的 C++ 有點不一樣,最後幾乎要整個 library 重寫 Orz

重寫就重寫嗎,一切都是為了看小説!

由於 eb 是日本人開發的,加上 eb 本身也歷史悠久,所以整個源碼,以及字典的編碼是基於 EUC-JP 上實現的。

而這個 eb library with UTF-8 ,裏面的 UTF-8 其實只是在 EUC-JP 上加一層 iconv。當然字典本身也有各種編碼,但在源碼方面看 EUC-JP 好像是底層編碼。我想這大概是因為製作字典的工具本身也是 EUC-JP 吧。

第一個問題是 iconv。iconv 本身是 GNU 的東西,需要找替代方案。起初我以為可以以 System.Text.Encoding 實現轉換,可惜 C++/CX 並沒有 System.Text 的 namespace。然後我又花了好長一段研究有沒有方法可以將 EncodingProvide 由 C# 傳到 C++/CX 上面,結果誤打誤撞找到了某個網站( 日文 ),提示可以用 MultibyteToWideChar 實現,試了一下可行。

第二個問題是 zlib,這個是用來讀取 ebz 格式的, zlib 好像可以直接使用,但我尚未研究出做法。不知道要怎麼編釋讓 C++/CX 也能用,在不確的是不是真的能用的情況下( 我在 stackoverflow 上問了一下答案是肯定的 ) ,我決定先不處理 ebz 格式,因為 eb 還有其格式可用,也有工具可以互相轉換。

第三個問題是 eb 會直接用 low level function 去讀取文件 ( read / seek )。這個在 C++/CX 上是禁止的,這也是讓整個 lib 幾乎要重寫的一大原因。但這只能手動地一個一個解決,沒有替代方案。

所以真正的問題應該是 zlib,但因為有替代方案所以也不是很嚴重的問題。但能直接讀取 ebz 是必須的。

下一章: 拆解 EBWIN 《二》

Project libeburc
Profile picture
斟酌 鵬兄
Tue Jan 19 2016 17:08:29 GMT+0000 (Coordinated Universal Time)
Last modified: Wed Oct 05 2016 08:09:03 GMT+0000 (Coordinated Universal Time)
Comments
No comments here.
Do you even comment?
website: 
Not a valid website
Invalid email format
Please enter your email
*Name: 
Please enter a name
Submit
抱歉,Google Recaptcha 服務被牆掉了,所以不能回覆了