珠海市民办中学名录:不用破解NOOK电子书,也能看中文

来源:百度文库 编辑:偶看新闻 时间:2024/05/04 14:56:00

  B&N NOOK在中文世界的人群手里日渐增多了。虽然其原生支持中文,但因种种原因,网上下载的一些epub书籍竟然显示“?”号,困惑了许多书友。新买来NOOK的书友最大的困惑,就是:不破解,就看不成网上下载的现成的书?

  本文讨论的前提:一是epub格式书籍,非内嵌(即外链)字体的epub书籍;二内嵌外链,是以epub文档为对象的,不是以阅读程序或系统来说的;三不破解,仅用官方的系统和阅读软件。

  一、汉字显示的原理

  这里讲的“原理”,不是教科书的大理论,只是简单的描述。

  1.1 内嵌与外链之争

  汉字(其实外文也一样)显示,在电脑上有两种处理思路:
  一是内嵌字体;
  二是外链字体。
  由于内嵌字体处理代价高价,每个文档都得重复打包进同样的字体,对内存和硬盘等存储资源的浪费极大,因此目前除PDF这种东东保留内嵌字体的不绿色、不环保的做法外,主流文档处理都采用外链字体的绿色做法。
  所谓外链字体,即是把字体文件安装在OS的规范的字体目录里(如Windows系统是在C:WindowsFonts),然后让所有的软件都把字体调用指向这个路径下的字体文件名称。这样,每个文档都不用在文档内部打包重复的字体文件,大大节省了文档体积和存储空间,对系统运行速度也有大幅提升。大家最常用的word、金山WPS等字处理软件和其他所有数据库等专用软件都是这么处理的。否则,让内嵌字体占居IT的主流地位,今天的信息处理将不堪重负。
  回到电子书阅读器,epub书籍的文字显示(中英文都一样)也是一样。有两种处理思路。内嵌字体的做法也如电脑上一样,每个文档都打包进字体文件,整个文档的体积将成10倍数10倍地增大。而外链字体,则把字体文件安装在系统字体目录或某个约定的目录里,让所有的epub书籍文档都可调用,大大节约了存储空间和增快机器运行速度。
  比如一个GBK字体文件,一般都得10MB左右,微软雅黑甚至15-25MB。本来一本30万字的书,体积也就600KB左右,加上单独一个字体文件,整个文档的体积就是10几20MB了。如果要像印刷书籍那样使用多种字体,那体积就更不得了。而外链字体呢,就是600多KB而已,仅增加几个文本代码文件,也就几十KB。
  详细的分析可点击参见我的另一帖子:《Epub:你太美了!——关于电子书阅读器统一字体路径名称和文档效率的讨论》。

  1.2 epub调用字体的原理

  那么,epub是怎么调用字体文件显示汉字的呢?
  epub调用显示文字的机制是:安装字体-定义字体-调用字体-显示字体。
  1)安装字体:把字体文件安装在一定的目录里。比如文档内部(内嵌字体)、内存或SD卡等存储器的某个目录、阅读器系统指定的目录。
  2)定义字体:在css文件(epub格式的灵魂和核心文件)中,先以@命令定义字体名称;再在字体名称定义中定义该字体安装的路径(目录)和具体的字体文件名。
  3)调用字体:在html文件(epub书籍的内容载体)中,用相应的标签命令调用css文件中定义的字体。
  4)显示字体:在epub阅读软件中,解析html和css文件中的标签和命令,把相应的文字显示在屏幕上。
  上述四个环节,是一个完整的链条和有机体系,缺一不可。

  二、NOOK为何“不”显示汉字

  Nook是android系统,而android本身是从底层就支持汉字显示的。可是,为何基于开放式操作系统的NOOK为何对网上下载的一些epub书籍不显示汉字呢?网上的epub书籍都是符合上述Epub字体调用机制的啊。
  原因我罗列一下:
  1.电子书阅读器行业规范的原因。目前的电子书阅读器市场没有统一的字体调用规范,字体安装和调用路径五花八门。因此不是每本Epub文档都支持所有阅读器的。我上面那篇帖子里有详细分析。
  2.身世的原因。NOOK出生太晚,网上epub资源出生“过早”。这样,那些书籍的制作者们,以及epub书籍的制作软件们,不认识NOOK。他们在epub文档中,只写了早就出生的SONY、kindle2/DX等机型的字体调用代码,不会有特异功能去写“未来”出生的NOOK的字体调用代码的。从我的观察来看,几乎每本下载的epub文档都含SONY系列机型的字体调用代码,而kindle系列由于不支持Epub格式,虽生得早(支持epub的多看就更晚了),也没有其调用代码。所以,SONY机型用户是最得意的呵呵。不过NOOK的出现,以后的软件和制作者会考虑的。
  3.NOOK本身的原因。我原来用的国产某品牌阅读器很“牛”,对Epub的支持很弱,对文档的css定义一概置之不理。但是很“神奇”,网上下载的几乎所有Epub文档,都可正常显示汉字,没有把一堆“?”光荣地展示给我。……其实一点也不神奇,它不过是太“牛”了,对文档中的css文件的所有样式定义都当透明人了,完全使用自己的css定义,使用自己最基本的样式:字体只有一种,系统默认的;排版只有一种,TXT那样的。 看明白了么?如果NOOK也学学如何?当然是悲剧。我就是看到该品牌这么“牛”才转投NOOK的啊。不过NOOK也可学学其中的合理因素啊。
  既然说到系统默认的css样式表,我就多说几句。NOOK可学的合理因素,就是内置一个默认的css样式表。如果遇到epub文档内的css定义的字体不存在或路径不存在,那就转而使用NOOK默认的css文件定义,起码可以显示汉字让人看嘛 我记得前个月向该品牌和多看团队提出过类似的建议,只是该品牌真的“牛”啊对我的建议置之不理,而多看团队接受了我的建议现在正在努力开发中。
  我的建议是:样式表可在系统选项中供用户自己选择、切换:
  1)epub文档css样式表。读取epub文档制作者定义的.css样式表来显示。
  2)系统默认css样式表。当epub文档没有css样式表或其中定义的字体等样式调用无效时,可强制使用系统默认的样式表。
  3)用户自定义css样式表。阅读软件忽略epub文档的css样式表,使用用户自己定义的基本样式。如:标题样式(字体、字号、行距、等)、正文样式(字体、字号、行距、等)、页面样式等。
  目前,能实现上述三种样式表功能的,尚无一家。当作“梦想”吧。
  (8/12更新:据高手lucida告知:NOOK的官方epub程序已经实现了上述三点中的前两点,牛!可惜只支持英文字体定义和调用,没有中文字体定义和调用。如果连第3点也实现,并且3点都增加中文字体定义和调用,就完全牛了呵呵)

  三、NOOK显示汉字的解决的思路

  从上面的分析可看出,NOOK不破解,只使用官方的系统和阅读软件,是完全可以阅读中文书籍的。基本的原理就一句话:调用在NOOK的系统字体目录等目录中本身就支持中文的默认字体文件,或在内存或SD卡上自己安装字体文件,所有的外链(非内嵌)Epub书籍都可显示汉字。

  3.1 NOOK字体显示机制分析

  下面从四个环节分析:
  1)字体安装问题:NOOK系统字体目录中已有一个各电子书阅读器中独一无二的字体:“DroidSansFallback”,字体文件安装在系统内存的system/fonts下(不破解是看不到这个目录的),文件名为DroidSansFallback.ttf。这个字体,既可显示英文,也可显示中文的黑体字。因此,即使不另外安装中文字体文件,也完全可以显示中文。当然按我的“唯美”要求,还是安装多种字体,更能体现印刷书籍一样精美的阅读体验。
  2)字体定义问题:修改epub文档中的css样式表,增加NOOK的字体定义。包括:
  a)修改字体名称:这一项也可不改,保留原字体名称。
  b)修改字体路径:增加NOOK的字体路径。这个是必须的。
  3)字体调用问题:这个……如果要修改html文件中的所有调用标签命令,应该说是“不可能”的任务,工程量太大了。我的意见,不必理会。替代办法:在每个html文件的头部增加上述字体定义和调用代码,或者调用外部css样式表的代码。这个办法可行。
  4)字体显示问题:这个不是我们用户的能力和权限所及的(坛里有高手修改了官方的readerepubr.apk,厉害呵呵。当然这是破解的了,不在本贴讨论范围内)。也不必理会。

  3.2 NOOK汉字显示的思路

  整理一下,让官方的epub阅读软件正确显示汉字的办法或思路有:
  一是修改epub文档的css样式表文件,增加对NOOK系统默认字体或新安装字体的定义和调用。
  二是修改epub文档的html内容文件,增加对NOOK系统默认字体或新安装字体的定义和调用。

  四、NOOK字体调用代码

  4.1 NOOK默认字体调用代码

  根据上述分析,我们要先弄明白调用的几个关键因素:
  1)NOOK默认字体名称:DroidSansFallback.ttf
  2)NOOK默认字体路径:system/fonts
  3)NOOK默认字体调用可以中英文混用的问题。

  4.1.1 据此,把epub文档调用NOOK系统默认字体的代码列于如下:
  4.1.1.1 简化纯中文代码。代码中,把字体名称定义为zw,路径为res:///system/fonts/DroidSansFallback.ttf。body引用了上面定义的’zw’。
[Copy to clipboard]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系列字体。
[Copy to clipboard]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.2 NOOK自装字体调用代码

  如果你对系统默认的黑体字不满意,而是想采用你喜欢的字体(比如“方正博雅宋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安装到这个目录,调用的代码为:
[Copy to clipboard]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安装到这个目录,调用的代码为:
[Copy to clipboard]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书友阅读。
[Copy to clipboard]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目录下:
[Copy to clipboard]CODE:
META-INF
OPS
  ├─..
  ├─ css
  │     └─main.css
  ├─ images
  ├─ chapter1.hmtl
      …
mimetype

  3.打开样式表文件。双击.css样式表文件,压缩程序会用记事本打开以供编辑。注意:有的样式表文件保存时有问题,打开的代码是一大串没有换行符的代码,看着头晕(coay.com生成的epub文档都这样,再晕)。解决办法,Ctrl+A选择全部,复制粘贴到一个空白word文档里,在word里就可识别出规范分行的代码;然后Ctrl+A选择全部,复制粘贴回记事本里,这回就显示规范分行的代码了。
  4.修改编辑样式表文件。在打开的样式表文件中,找到以@开头的字体名称定义代码和body代码,用上述NOOK代码(4种代码任选一)覆盖粘贴,即用NOOK代码取代原代码。
  注意:
  如果你选用4.1的两个代码之一,NOOK将调用显示系统默认字体;
  如果你选用4.2的两个代码之一,NOOK将调用显示你自已喜欢并安装的字体;
  如果你选用4.3的代码,NOOK会按内存自装字体、TF卡自装字体和系统默认字体的顺序优先调用显示。(如果没有安装自已的字体文件,NOOK会自动调用系统默认的DroidSansFallback.ttf字体显示。)
  5.保存修改后的样式表文件。用NOOK代码取代原代码后,点击保存。这时,压缩软件会提示你保存整个压缩文件,按要求保存。关闭退出压缩软件。
  6.改回原后缀名。将修改后的压缩文件后缀.zip改回.epub。修改完成。可用ADE查看或传到NOOK阅读。

  (二)修改html文件

  可用手工修改或软件修改。推荐软件修改,减少工程量。推荐的软件是calibre。
  用calibre转换原来显示问号的epub文档,其原理是在epub文档中的每个html文件的头(head)部增加style代码,并修改所link的css文件路径和文件名。根据html和epub规范,在html文件中,内部的标签代码优先于外链的css样式表的同名标签代码。
  如何用calibre修改epub文档增加中文调用显示?
  1.装入文档。在calibre中装入需要修改的epub文档。
  2.打开转换选项。点击程序上部左起第二个图标,即点转换图标-分别转换,打开转换设置对话框。
  3.设置css。在转换设置对话框中点击左边的“外观”图标,在“额外CSS”框中,复制粘贴上述NOOK代码。这个代码,将会被添加到源文件的样式规则中,它可以覆盖输入文件中已定义的相同样式。
  同样注意:
  如果你选用4.1的两个代码之一,NOOK将调用显示系统默认字体;
  如果你选用4.2的两个代码之一,NOOK将调用显示你自已喜欢并安装的字体;
  如果你选用4.3的代码,NOOK会按内存自装字体、TF卡自装字体和系统默认字体的顺序优先调用显示。(如果没有安装自已的字体文件,NOOK会自动调用系统默认的DroidSansFallback.ttf字体显示。)
  4.转换。如果没有其他设置,请点击对话框右下角的“确定”按钮。这时,对话框消失,calibre程序开始转换,右下角的“任务”图标会转啊转,转完后就OK了。
  5.提取epub文档。转换成功的epub文档,可以传到NOOK上阅读了。两种方式:
  1)同步:calibre有与NOOK同步功能,可以在连接NOOK(calibre上端右起第四个图标connet/share)后同步到NOOK上。
  2)保存:点击calibre上端右起第五个图标“保存到磁盘”,然后通过USB线复制到NOOK上。
  通过上述转换,应该可以在NOOK上看下载的原来问号一堆的中文epub书了。

  (三)样式表修改简化方案

  所谓样式表修改简化方案,是从解决方案一即修改样式表文件方案简化而来的。
  简化方案的基本含义,就是对方案一的代码进行简化,只添加NOOK默认字体调用的一句代码,不改变原css文件的其他内容。
  例子:“万水千山走遍(三毛).epub”原样式表中仅定义了SONY系列机型的字体定义和路径:
[Copy to clipboard]CODE:
@font-face {
font-family:”cnepub”;
src:url(res:///opt/sony/ebook/FONT/tt0011m_.ttf), url(res:///tt0011m_.ttf);
}

  把这个epub文档传到NOOK上是肯定显示满屏问号的。怎么办?只需在其中添加一句NOOK默认字体路径代码即可:
[Copy to clipboard]CODE:
url(res:///system/fonts/DroidSansFallback.ttf);

  修改后,完整的字体定义代码为:
[Copy to clipboard]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);

  这三种简化代码,随你喜欢吧。
  解决方案三的具体实例解剖,请稳步点击进入《NOOK step by step:不破解,也中文。实例》一贴。

  六、问题讨论

  (一)关于Calrbre软件转换的问题

  不过,calibre这个软件实在不太好用,转换出来的代码很不简洁,与我“简洁就是美”的理念不相容。唉。比如下面这个用calbre转换后在html文件的头部添加的字体调用和定义代码示例,添加了一些不简洁不必要的代码,还把原css样式表文件中的”shucang”等字体定义搬家到每一个html里来了,而本次所希望增加的zw字体定义(上述代码4.1.1.1),只定义了字体名称,却把该字体的路径定义漏掉了。我翻遍了整个epub文档,没有找到这里所遗漏的定义路径定义添加到哪儿啦。匪夷所思。
[Copy to clipboard]CODE:

  经反复测试证明: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黑体字:

  
[Copy to clipboard]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文档中的不规范的大写字母代码,最后终于成功。详情请点击《NOOK step by step:不破解,也中文。实例》一贴。

  七、转换成果

  用上述原理和解决方案进行网上下载资源的转换,成果实例放在《epub资源转换:报刊。经济。政治》这个贴子里,大家有兴趣可以去参考和照葫芦画瓢。大家也可把实验结果传到那贴,让更多的书友分享。
  我的实验性举例是一本从掌上书苑上下的《万水千山走遍》(三毛),已经是我刚才添加了NOOK默认字体路径代码的了,NOOK可以直接阅读了。