最近有很多朋友問jmbook.dat是一個什麼樣的電子書格式,以及手機電子書製作軟體如何開發的問題,那我就在今天這篇文章裡一起來做個說明。
先來介紹一下jmbook.dat的格式,說白了,它其實就是一個jar包,只是改了一下副檔名,這個包裡已經包含了在手機上運行所需要的java基本程式碼,它所缺少的只是跟具體手機電子書內容相關的部分,(角摩手機電子書,http://www.joymo.cn)把內容部分加入到這個jar包後,它就是一個完整的可以在手機上安裝啟動並執行手機電子書jar檔案了。
那麼內容部分包括什麼東西,又怎麼把內容部分加入到.dat檔案中,這便是joymobiler整個手機電子書製作軟體的核心。 首先我們來看看哪些內容是我們要放到.dat中去的,包括三部分,索引檔案,資料檔案以及MANIFEST。
一、索引檔案(該索引檔案採用跟JBookMaker一樣的格式,所以相容JBookMaker的電子書)
它的格式是固定的,如果不能按正確的格式產生索引檔案,程式在運行後就沒法正常顯示電子書內容,檔案名稱就是"0"。格式如下:
頭三個位元組:0x00,0x01,0x30
雙位元組:書名長度
接著位元組:書名內容 (UTF8編碼)
雙位元組:書的章節數量長度
接著位元組:書的章節節數量(UTF8編碼)
雙位元組:第一章區段標頭長度
接著位元組:第一章區段標頭內容(UTF8編碼)
...(其餘章區段標頭長度和標題內容)
四位元組:著作權資訊長度
接著位元組:電子書進入時的介面顯示內容,可以放作者、製作者一類的資訊,用斷行符號換行分隔即可(UTF8編碼)
二、資料檔案
檔案名稱從1開始,按2,3,4。。。在順序依次遞增,資料檔案的數量跟索引檔案中書的章節數量一致。檔案採用UNICODE編碼方式。
三、MANIFEST.MF檔案
這個檔案是一個描述檔案,UTF8編碼,大部分內容是固定的,格式化如下:
Manifest-Version: 1.0
Ant-Version: Apache Ant 1.6.5
Created-By: www.joymo.cn
MIDlet-1: BookName,/jm.PNG,JavaBook
MIDlet-Vendor: Joymo.cn
MIDlet-Version: 1.0
MIDlet-Name: BookName
MicroEdition-Configuration: CLDC-1.0
MicroEdition-Profile: MIDP-1.0
只需修改bookname部分,這樣安裝後就可以在手機上看到有“bookname”的電子書了。
瞭解以上內容後,即便是我們手工產生了以上部分,把JMBook.dat改成JMBook.jar,然後把以上三部分的檔案加入到JMBook.jar中,即可以放到手機上安裝了。如果是想通過程式的方式實現,這其中的需要注意的地方是二點:
一、注意內容的編碼方式,很多時候我們是GB2312的文本,要注意轉換,在VC中可以用MultiByteToWideChar和WideCharToMultiByte進行處理。編碼格式的轉換可以參考如下代碼:
BYTE utf32_le[]={0xFF,0xFE,0x00,0x00};
if(memcmp(lpstrInputStream,&utf32_le,4)==0)
return UTF32_LE;
BYTE utf32_be[]={0x00,0x00,0xFE,0xFF};
if(memcmp(lpstrInputStream,&utf32_be,4)==0)
return UTF32_BE;
BYTE utf_8[]={0xEF,0xBB,0xBF};
if(memcmp(lpstrInputStream,&utf_8,3)==0)
return UTF_8;
BYTE utf16_le[]={0xFF,0xFE};
if(memcmp(lpstrInputStream,&utf16_le,2)==0)
return UTF16_LE;
BYTE utf16_be[]={0xFE,0xFF};
if(memcmp(lpstrInputStream,&utf16_be,2)==0)
return UTF16_BE;
// Else
if(IsTextUnicode((void *)lpstrInputStream,iLen,NULL))
return UTF16_LE;
二、操作jar檔案
產生的內容最終是要加入到JMBook.dat所對應的jar檔案中的,而jar是一種標準的zip檔案,有很多開源的代碼支援對jar在操作,比如zlib等。
知道了這兩部分的機制後,剩於下的工作其實就很簡單了,就是把產生的內容直接壓入到jar檔案中即可。