拆解 EBWIN 《二》
距上一次的  拆解 EBWIN 已經過了大半年了嗎…

説一下感想吧,這個 libeburc 在看 小説家になろう 的時候得到了很大的幫助。手上的 3 本字典中,雖然只用了一本,但一本好像就夠了。字典是很厲害的東西!

至於在 wen10 上要怎麼安裝及使用詞典,這我在半年前應該寫了在 github 才對。有興趣的話不妨去試用一下?

===

我説過我手上有三本詞典吧,第一本是 《大辭林》 ,第二本是 《新明解国語辞典》,第三本則是 《小学館「中日/日中辞典」》。

平常一直用的是 《大辭林》,最近才試了一下 《新明解》 ,發現用不了,然後又急忙修好了。所以手上有兩本詞典是能用的。

《小学館「中日/日中辞典」》


於是我又著手翻弄第三本詞典,並不是完全不能用,只是部分顯示的字會是亂碼:
[11:14:57.441757][INFO][libeburc] Character Code: JIS X 0208 + GB 2312
[11:14:57.441924][INFO][libeburc] Number of Subbooks: 1
[11:14:57.442062][INFO][libeburc]
[11:14:57.774293][INFO][libeburc] Subbook 0:
[11:14:57.774434][INFO][libeburc]   Directory: ZHONG_RI
[11:14:57.774518][INFO][libeburc]   Title: 小学館「中日/日中辞典」統合版
[11:14:57.809140][INFO][libeburc]   Search methods: word endword multi
[11:14:57.826945][INFO][libeburc]   Font sizes: 16
[11:14:57.827082][INFO][libeburc]   Narrow char range: 0xA421 - 0xA664
[11:14:57.858969][INFO][libeburc]   Wide char range: 0xA121 - 0xA242
[11:14:58.211329][INFO][libeburc]   Search "水田" hits 2 result(s)
[11:14:58.211497][INFO][libeburc]     Heading: { Page: 44824, Offset: 692 }
[11:14:58.211569][INFO][libeburc]     Text: { Page: 23485, Offset: 1126 }
[11:14:58.335793][INFO][libeburc]     Text: すいでん<?><?>水田<?>
犠弥d<?>oti<?>n,邦弥shu<?>ti<?>n.¶畑を〜にする/個叉仇h<?>nd<?>葎w<?>i邦弥.¶〜土壌/(紗垢朔癖栽嶽邦犠議)邦弥輿叛t<?>r<?>ng.

[11:14:58.335936][INFO][libeburc]     Text: { Page: 27229, Offset: 1796 }
[11:14:58.336009][INFO][libeburc]     Heading: { Page: 44824, Offset: 718 }
[11:14:58.407651][INFO][libeburc]     Text: みずた<?>水田<?>
邦弥shu<?>ti<?>n.
這種亂碼不是一般的亂碼,普通的亂碼應該是由頭亂到尾的,可以這個不一樣,感覺好像是混合編碼?

混合編碼是一種好麻煩的東西欸,GB2312 用的是 0x0000 - 0xFFFF ,EUC-JP 用的也是 0x0000 - 0xFFFF,這樣我很難判斷某個文字到底是 EUC-JP 還是 GB2312 嘛。

於是我東翻翻西翻翻,想著 GB2312 跟 EUC-JP 兩種編碼可以融合在一起嗎?理論上不可行吧?但 Character Code 卻強烈地表明著這是「JIS X 0208 + GB 2312」,也就是説有解碼的方式囉?

對 EBXA-C 的支援

在詞典的資料夾下面有一個叫做 ZHONG_RI.txt 的文件,上面劈頭就寫著:
#	Name	:ZHONG_RI.map
#	Purpose	:小学館日中・中日辞典(EBXA-C)用外字定義ファイル
#		 SONY電子ブックプレーヤー「小学館編中日/日中辞典統合版」『DD-CH10』添付品
#	Author	: hishida, wonthen
#
#	基礎知識:EBXA-Cは日本語部分はJIS X0208、簡体字にはGB2312が使用されている。
#	それ以外に、異体字や繁体字のエンコードに独自の外字コードが使用されている。
#		hXXXX	- EB半角外字(A421~A664)
#		zXXXX	- EB全角外字(A121~A242)
#		cXXXX	- 0x1F1C~0x1F1Dタグの間に現れる外字
#		gXXXX	- GB2312の未使用領域にマッピングされた外字
#			※EBXA-Cでは下位バイトのみMSB1だが、ここでは上位下位バイトともMSB1で表現)
#			※GB2312の未使用領域は10区~15区だが、EBXA-Cでは4区~9区も独自外字に使用している
這 EBXA-C 是什麼啊?我 duckduckgo 了一下,發現在這則日文維基上這樣寫道:
EBXA-C
    中国語対応の電子ブック(ソニーの電子ブックプレーヤーDD-CH10に付属する「小学館中日/日中辞典」のみ。このタイトルは文字と画像と音声を含む)
.
.
.
EBXA-Cは中国語に対応のため文字コードは特殊であり、日本語のJIS X 0208と、GB 2312をベースとした独自中国語文字コードを併用している。
還真做得出來啊?!

沒辦法,只好含著淚找找看這到底要怎麼解碼好了。

read_text_internal

接下來就是編程 talks 了,ebライブラリー 中的 readtext.c 有個 static EB_Error_Code eb_read_text_internal ,貌似所有讀取文字的功能都會通過這裏。搜了一下 2312 會意外地發現在好幾處對應 EXBA-C 的跡象。

else 下面有一句這樣的 comment:
/*
 * The book is written in JIS X 0208 or JIS X 0208 + GB 2312.
 */

哦哦,好像找對地方了!嗯嗯,亂碼是因為原本就沒有 GB2312 <-> UTF8 的對照表啊,看起來是直接將 GB2312 的 CharCode 寫上去了。也就是説我得在此之前……嗯?這個有個叫 GB2312 的 hook ?這不是正就是對應這情況而寫的嗎?!

這裏如果直接寫 UTF8 上去好像不對呀,因為其它 function 是以 EUC-JP 寫上去的 ,最後才一次過將整個文字由 EUC-JP -> UTF8 ,如果這裏寫 UTF8 上去的話,後面的轉換就會錯了。

好吧,這邊找到解決方法了,接下來是第二個問題。

索引加速

很多時候載入詞典後發現用不了,是因為詞典在編製時啟用了「索引加速」,這功能是一個迷,一旦啟用 eblibrary 就會搜不了字。現時的解決方法就是到 ebstudio 下載 ebshrink ( 就是 ebwin 主體的其中一個工具 ),重新編制取消掉加速。

説實話這個還需要研究一下。
Profile picture
斟酌 鵬兄
Wed Oct 05 2016 04:30:51 GMT+0000 (Coordinated Universal Time)
Last modified: Wed Oct 05 2016 06:27:15 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 服務被牆掉了,所以不能回覆了