B&NNOOK在中文世界的人群手里日渐增多了。虽然其原生支持中文,但因种种原因,网上下载的一些epub书籍竟然显示“?”号,困惑了许多书友。新买来NOOK的书友最大的困惑,就是:不破解,就看不成网上下载的现成的书?
本文讨论的前提:一是epub格式书籍,非内嵌(即外链)字体的epub书籍;二内嵌外链,是以epub文档为对象的,不是以阅读程序或系统来说的;三不破解,仅用官方的系统和阅读软件。
一、汉字显示的原理
这里讲的“原理”,不是教科书的大理论,只是简单的描述。
1.1内嵌与外链之争
1.2epub调用字体的原理
那么,epub是怎么调用字体文件显示汉字的呢?epub调用显示文字的机制是:安装字体-定义字体-调用字体-显示字体。1)安装字体:把字体文件安装在一定的目录里。比如文档内部(内嵌字体)、内存或SD卡等存储器的某个目录、阅读器系统指定的目录。2)定义字体:在css文件(epub格式的灵魂和核心文件)中,先以@命令定义字体名称;再在字体名称定义中定义该字体安装的路径(目录)和具体的字体文件名。3)调用字体:在html文件(epub书籍的内容载体)中,用相应的标签命令调用css文件中定义的字体。4)显示字体:在epub阅读软件中,解析html和css文件中的标签和命令,把相应的文字显示在屏幕上。上述四个环节,是一个完整的链条和有机体系,缺一不可。
二、NOOK为何“不”显示汉字
三、NOOK显示汉字的解决的思路
从上面的分析可看出,NOOK不破解,只使用官方的系统和阅读软件,是完全可以阅读中文书籍的。基本的原理就一句话:调用在NOOK的系统字体目录等目录中本身就支持中文的默认字体文件,或在内存或SD卡上自己安装字体文件,所有的外链(非内嵌)Epub书籍都可显示汉字。
3.1NOOK字体显示机制分析
下面从四个环节分析:1)字体安装问题:NOOK系统字体目录中已有一个各电子书阅读器中独一无二的字体:“DroidSansFallback”,字体文件安装在系统内存的system/fonts下(不破解是看不到这个目录的),文件名为DroidSansFallback.ttf。这个字体,既可显示英文,也可显示中文的黑体字。因此,即使不另外安装中文字体文件,也完全可以显示中文。当然按我的“唯美”要求,还是安装多种字体,更能体现印刷书籍一样精美的阅读体验。2)字体定义问题:修改epub文档中的css样式表,增加NOOK的字体定义。包括:a)修改字体名称:这一项也可不改,保留原字体名称。b)修改字体路径:增加NOOK的字体路径。这个是必须的。3)字体调用问题:这个……如果要修改html文件中的所有调用标签命令,应该说是“不可能”的任务,工程量太大了。我的意见,不必理会。替代办法:在每个html文件的头部增加上述字体定义和调用代码,或者调用外部css样式表的代码。这个办法可行。4)字体显示问题:这个不是我们用户的能力和权限所及的(坛里有高手修改了官方的readerepubr.apk,厉害呵呵。当然这是破解的了,不在本贴讨论范围内)。也不必理会。
3.2NOOK汉字显示的思路
整理一下,让官方的epub阅读软件正确显示汉字的办法或思路有:一是修改epub文档的css样式表文件,增加对NOOK系统默认字体或新安装字体的定义和调用。二是修改epub文档的html内容文件,增加对NOOK系统默认字体或新安装字体的定义和调用。
四、NOOK字体调用代码
4.1NOOK默认字体调用代码
根据上述分析,我们要先弄明白调用的几个关键因素:1)NOOK默认字体名称:DroidSansFallback.ttf2)NOOK默认字体路径:system/fonts3)NOOK默认字体调用可以中英文混用的问题。
4.1.1据此,把epub文档调用NOOK系统默认字体的代码列于如下:4.1.1.1简化纯中文代码。代码中,把字体名称定义为zw,路径为res:///system/fonts/DroidSansFallback.ttf。body引用了上面定义的’zw’。[Copytoclipboard]CODE:@font-face{font-family:”zw”;url(res:///system/fonts/DroidSansFallback.ttf);}body{font-family:‘zw’,serif;}
这个代码,适用于纯中文文档,或者以中文为主,偶有英文单词的文档。目前网上下载的诸多现成epub文档,大都为这类文档。因此推荐这个简洁的代码。4.1.1.2中英文共用代码。代码中,把字体名称定义为DroidFont,路径为res:///system/fonts/DroidSansFallback.ttf。body引用了上面定义的’DroidFont’,并且定义英文的第二顺序为serif系列字体。[Copytoclipboard]CODE:@font-face{font-family:“DroidFont”,serif,sans-serif;font-weight:normal;font-style:normal;src:url(res:///system/fonts/DroidSansFallback.ttf);}@font-face{font-family:“DroidFont”,serif,sans-serif;font-weight:bold;font-style:normal;src:url(res:///system/fonts/DroidSansFallback.ttf);}@font-face{font-family:“DroidFont”,serif,sans-serif;font-weight:normal;font-style:italic;src:url(res:///system/fonts/DroidSansFallback.ttf);}@font-face{font-family:“DroidFont”,serif,sans-serif;font-weight:bold;font-style:italic;src:url(res:///system/fonts/DroidSansFallback.ttf);}
这个代码,适用于中英文混合文档,比如英文学习、教育类Epub书籍。不是这类书籍不必用这个代码。
4.2NOOK自装字体调用代码
如果你对系统默认的黑体字不满意,而是想采用你喜欢的字体(比如“方正博雅宋GBK.ttf”),则可将之改名为zw.ttf。1)NOOK自装字体名称:zw.ttf。2)NOOK自装字体路径:一是内存新建fonts目录,路径全称是:system/media/sdcard/fonts;二是TF卡根目录新建fonts目录,路径全称是:sdcard/fonts。然后采用如下两种办法安装调用
4.2.1在NOOK内存新建fonts目录,字体文件zw.ttf安装到这个目录,调用的代码为:[Copytoclipboard]CODE:@font-face{font-family:”zw”;url(res:///system/media/sdcard/fonts/zw.ttf);}body{font-family:‘zw’,serif;}
4.2.2在NOOK的扩展TF卡根目录新建fonts目录,字体文件zw.ttf安装到这个目录,调用的代码为:[Copytoclipboard]CODE:@font-face{font-family:”zw”;url(res:///sdcard/fonts/zw.ttf);}body{font-family:‘zw’,serif;}
4.3集成型字体调用代码
下面这个代码,既可调用内存fonts目录下的zw.ttf字体,也可调用TF卡根目录fonts目录下的zw.ttf字体。如果没有安装这个自己的字体,也可调用系统默认的DroidSansFallback.ttf字体。适合于修改的Epub可以自己阅读,也可传给其他NOOK书友阅读。[Copytoclipboard]CODE:@font-face{font-family:”zw”;url(res:///system/media/sdcard/fonts/zw.ttf),url(res:///sdcard/fonts/zw.ttf),url(res:///system/fonts/DroidSansFallback.ttf);}body{font-family:‘zw’,serif;}
五、解决方案
(一)修改样式表文件1.改后缀名。将下载的epub文档的后缀.epub改为.zip。如将“红楼梦八十回后真故事.epub”改为“红楼梦八十回后真故事.zip”。解释:epub文档其实就是压缩文件,把若干代码文件和内容文件按一定规则打包压缩而成。2.打开压缩文件。进入ops目录,找到以.css为后缀的样式表文件。这个样式表文件也可能被制作者放在再下一级子目录里。也有的epub文档竟然没有按规范把代码文件和内容文件放到ops目录里,而是全部扔到根目录下,晕。(coay.com生成的epub文档都这样)下面是一个例子。样式表文件main.css放在ops/css目录下:[Copytoclipboard]CODE:META-INFOPS├─..├─css│└─main.css├─images├─chapter1.hmtl…mimetype
(二)修改html文件
(三)样式表修改简化方案
所谓样式表修改简化方案,是从解决方案一即修改样式表文件方案简化而来的。简化方案的基本含义,就是对方案一的代码进行简化,只添加NOOK默认字体调用的一句代码,不改变原css文件的其他内容。例子:“万水千山走遍(三毛).epub”原样式表中仅定义了SONY系列机型的字体定义和路径:[Copytoclipboard]CODE:@font-face{font-family:”cnepub”;src:url(res:///opt/sony/ebook/FONT/tt0011m_.ttf),url(res:///tt0011m_.ttf);}
把这个epub文档传到NOOK上是肯定显示满屏问号的。怎么办?只需在其中添加一句NOOK默认字体路径代码即可:[Copytoclipboard]CODE:url(res:///system/fonts/DroidSansFallback.ttf);
修改后,完整的字体定义代码为:[Copytoclipboard]CODE:@font-face{font-family:”cnepub”;src:url(res:///opt/sony/ebook/FONT/tt0011m_.ttf),url(res:///tt0011m_.ttf),url(res:///system/fonts/DroidSansFallback.ttf);}
这样简单地添加一句NOOK字体路径语句,epub文档就能顺利在NOOK上阅读了。注意的是,所谓简化,是指复制添加的NOOK字体定义语句的简化。修改的步骤仍与上述解决方案一一样,因此不再详述操作步骤。以此类推,你如果不喜欢默认字体,也可以简单地把自装字体的定义路径语句添加进去。因此,小结一下,简化的NOOK字体调用代码,可以有三种:一是默认字体简化代码:url(res:///system/fonts/DroidSansFallback.ttf);二是自装内存字体简化代码:url(res:///system/media/sdcard/fonts/zw.ttf);三是自装TF卡字体简化代码:url(res:///sdcard/fonts/zw.ttf);
这三种简化代码,随你喜欢吧。解决方案三的具体实例解剖,请稳步点击进入《NOOKstepbystep:不破解,也中文。实例》一贴。
六、问题讨论
(一)关于Calrbre软件转换的问题
不过,calibre这个软件实在不太好用,转换出来的代码很不简洁,与我“简洁就是美”的理念不相容。唉。比如下面这个用calbre转换后在html文件的头部添加的字体调用和定义代码示例,添加了一些不简洁不必要的代码,还把原css样式表文件中的”shucang”等字体定义搬家到每一个html里来了,而本次所希望增加的zw字体定义(上述代码4.1.1.1),只定义了字体名称,却把该字体的路径定义漏掉了。我翻遍了整个epub文档,没有找到这里所遗漏的定义路径定义添加到哪儿啦。匪夷所思。[Copytoclipboard]CODE:
@font-face{font-family:“shucang4sony”;src:url(res:///opt/sony/ebook/FONT/tt0003m_.ttf)}
@font-face{font-family:“zw”}
经反复测试证明:calibre很顽固地把原css文件删除了,取代的css文件又顽固地定义了.calibre1、2、3等类。而.calibre1类又恰恰定义了莫名的字体名称。正确贯彻我们转换意图的只是在DIV中定义了DroidFont字体。在html中,正文又恰恰用
。这样,没有字体定义的正文只能显示满屏的“?”。一个补救的办法:把calibre转换后的css文件中.calibre1、2、3等三个类删除掉,仅保留.calibre一个类即可。不过这样,不就回到了解决方案一的修改css文件的办法了么?绕了一圈啊所以,还是用解决方案一的修改样式表的办法实在,呵呵。不过对恐惧修改文本的书友可能还是想找个软件自动转的方便。这就得想法子,看看其他什么软件能帮忙了。看来,calibre不能用了。建议大家还是用解决方案一的办法,修改css文件吧。
(二)关于转换资源的选择
通过8月13日晚一通宵的努力和第二天下午几分钟的努力,发现不同网站上下的epub规范不一、良莠不齐。比如书仓里下的报刊,用顶贴两个解决方案都无可奈何,昨晚一个通宵就费在这无果的“探索”上了。书仓里下的书籍,也费了老大功夫,只能显示标题2(h2)汉字,其他仍是问号。究其原因,可能是与书仓在xml文件上做了“手脚”,或css类定义过于繁杂,让阅读软件无所适从。用在线epub规范查错网站来查错,书仓里的报刊epub和书籍epub文档,错误多得惊天动地BUG多达近百条!罢了,不看书仓上的书籍了。这可是一个晚上和通宵的“成果”啊刚才外出回来,用几分钟处理了从掌上书苑(cnepub)上的书,结果很不错。完全是采用顶贴的解决方案,一次修改实验成功,期间没有任何难点。刚才处理的是原来从cnepub下的《万水千山走遍》(三毛),只在原为SONY系列机型定义的@字体定义中增加下面一句NOOK的默认字体路径代码(红字),保存传到NOOK上马上如愿显示了默认的DroidSansFallback黑体字:
[Copytoclipboard]CODE:@font-face{font-family:”cnepub”;src:url(res:///opt/sony/ebook/FONT/tt0011m_.ttf),url(res:///tt0011m_.ttf),url(res:///system/fonts/DroidSansFallback.ttf);}
昨晚的“失败”,搞得我怀疑我的原理和代码是否出了大问题。其实没有。出问题的是网上资源良莠不齐,很多都不符合Epub规范。因此,看书,就看规范的书;否则,徒费精力。做书,也要做规范的书;否则,还浪费他人的期待。8月16日夜补:由于书仓epub文档的不规范,费了不少周折。除按方案三修改css外,还修改纠正了所有html文档中的不规范的大写字母代码,最后终于成功。详情请点击《NOOKstepbystep:不破解,也中文。实例》一贴。