由于 Amazon Kindle 目前只在美国和英国等少数以英语为主要语言的国家发售,它的键盘甚至无法原生输入俄语、挪威语等字母语言,更别提中文了。自然,它对中文的默认支持也不怎 么样。但是作为一个母语为中文的 Kindle 用户,阅读中文书籍是经常发生的事,用中文作笔记也是会遇到的。而我是一个完美主义者,面对网上那些数量稀少且并不完美的 Kindle 中文阅读教程,我决定自己动手,探索、整理出一份“完美”的 Amazon Kindle 中文阅读优化指南。
一、Kindle 基本介绍
Amazon Kindle 是 Amazon 公司(或者叫 Amazon 帝国更贴切……)推出的一系列电子书阅读器。目前主要有以下设备:
- 第一代:Kindle
最早的版本,只有白色版,屏幕就四阶灰度,可用存储空间只有 180MiB…… - 第二代:Kindle 2 和 Kindle DX(包括 Kindle DXG)
Kindle 2 开始有十六阶灰度屏了。Kindle DX 是 Kindle 2 的“放大版”,固件和 Kindle 2 是一样的。DXG 是灰色版的 DX,不过性能上也有一些改进。 - 第三代:Kindle Keyboard →我用的
最流行的版本,很好很强大,3G 版更可全球漫游上网。 - 第四代:Kindle 和 Kindle Touch
第四代就叫 Kindle……民间也叫 Kindle 4,它有一个非触屏和一个触屏版,是 Kindle Keyboard 的“缩水版”,但是比较便宜,只要 $79。 - Kindle Fire(基于 Android 的平板电脑)
我觉得这个不能算在前面的系列里,因为它不再是用 E-Ink 屏幕了。 - Kindle Reading Apps(运行于 iOS 和 Android 设备,以及网页上)
这个只能算一套软件了……而不是硬件设备,放在这里只是因为名字里有“Kindle”。
本文所指的 Kindle,主要是指 Amazon 推出的各代以 E-Ink 作为显示屏幕的设备,不包括 Kindle Fire 和 Kindle Reading Apps 在内。
本文用作教程的 Kindle,即我有拥有的 Kindle,是 Kindle 的第三代,官方名称为 Kindle Keyboard,本教程所介绍的方法理论上也可用于其他代的 Kindle(不包括 Kindle Fire)。 Kindle Touch 用户可以参考这个帖子。
本文所提到的 update-*.zip
文件均出自 MobileRead 论坛,可在此链接找到。
二、现状与我们的目的
正如上文所说,Kindle 未在使用 CJK/CJKV(中日韩(越)统一表意文字) 的国家和地区发售,所以默认对 CJK 的支持是比较差的,在目录界面下,一些中文字会变成□□□□,在网页里,中文字的大小也是很不整齐的,并且有不少是用的日本字型,笔画看着很奇怪。
以上提到的问题虽然可以通过 changeLocale
的 debug
代码来解决,但是阅读中文时的字体依然是丑陋的无衬线字体。这种无衬线字体在 CRT 和 LCD 上用用还勉强能接受,但是在接近印刷品的 E-Ink
屏幕上用,就显得太不搭调了,长时间阅读会造成眼睛非常疲劳,丧失了 E-Ink
的优点。并且,默认的中文字体是没有标准、粗体、斜体、粗斜体的区分的,无论是标题还是正文还是注释,一律是同样的样式。对比拉丁字符的不同样式,实在是
令人不爽。
首先声明一点:电脑上各种字处理软件里中文字体的“粗体”实质是“仿粗体”,“斜体”实质是“仿斜体”,是软件模拟出来的,只有少量中文字体(如微软雅黑)的粗体、斜体才是独立的字体。
正是因为这种软件模拟的存在,我们才能在电脑上看到各种中文字符“变粗”(仿粗体)和“变斜”(仿斜体),哪怕这个字体本身没有对应的粗体和斜体。而手持设备上一般没有这种软件模拟,所以只能显示字体本身的样子。但是,既然有“仿粗体”和“仿斜体”,就有真正的粗体和斜体,比如微软雅黑和粗体的微软雅黑是两个独立的字体,前者是 msyh.ttf
,后者是 msyhbd.ttf
。我们只要使用独立的粗体、斜体字体便可在 Kindle 上实现中文字符的不同样式。
能“解决”上面所有的问题方法的是把所有的书全部弄成 PDF。但是要在 Kindle 上看 PDF,最好得是特制的六寸 PDF。每本书都转换并且方便,并且 PDF 相比 mobi 格式丧失了不少功能,因此该方法被枪毙。
所以,作为一个完美主义者,我要实现以下目的:(递进)
- 完美显示中文(告别□□□□!)
- 使用优质的衬线中文字体来代替无衬线中文字体(让 E-Ink 像印刷品一样!)
- 实现中文字体的普通、粗体、斜体、粗斜体的不同样式(标题就该突出!)
- 目录界面和状态栏中的中文也要使用自定义字体并显示出样式(光阅读界面是好看的怎么能叫完美呢?)
除此以外,由于我还需要用 Kindle 阅读英语和德语的书籍,所以还有一个附加要求: - 拉丁字符要保持原有的专业与美观,不能变丑(中文字体里嵌的拉丁字符实在不敢恭维)
三、两种不完美的解决方案
calibre 法
这种方法不需要越狱,几乎接近完美。但是很遗憾,它有 bug,不完美。这里简略介绍一下步骤,完整的图文教程可见《Kindle 3 不越狱换字体》。
- 安装 calibre 这个强大到变态的专业、开源、自由的跨平台(基于 Python)电子书管理软件。
- 安装 Kindle Collections 这个 calibre 插件。
- 连接 Kindle,把优质衬线中文字体(如方正雅宋系列)按照特定的命名规则(
CJK-Regular.ttf, CJK-Bold.ttf...
)复制到fonts
目录下。 - 连接 Kindle,在 Kindle Collections 里选择
Modify Kindle Settings
,勾选Allow user fonts
,并在列表中选择CJK
。 - 在提示成功后,拔掉并重启 Kindle,在阅读的时候按 Aa键,便可看到
Typeface
一项中多了一个alt
,那个就是自定义字体了。
这种方法接近完美,可以实现中文字体的不同样式显示,但是该方案的三个问题,这是我在使用的过程中发现的:
- 虽然在阅读界面下,已经是自定义字体了,但是目录界面和状态栏的标题仍然调用的是简陋的原生字体,不爽。
- 在阅读中英混合的书籍时,如果选择了自定义的衬线中文字体,那么书中的拉丁字符也会用自定义字体来渲染,而中文字体中的拉丁字符一般都比较丑陋,远没有纯拉丁字体中的字符好看,不爽。而如果选择原生字体,那么中文字符也会变成自带的衬线字体,依然不爽。
也就是说,该方法能实现到上面的“目的列表”里的第 3 条,而第 4、5 条无法实现。 - 更大的 bug:看起来Aa中的几种 Typeface 是可以自由切换的,但是实际上是有 bug 的,即切换成非 alt 之后,想再切换回来就会发现……alt 选项消失了!这意味着你就算不在乎上面那个 bug,在需要看英文书籍的时候切换到原生字体后,再看中文书籍时,根本无法切换成自定义字体(alt)!这个奇葩的 bug 只能通过连接电脑,在 calibre 的 Kindle Collections 里再次设置并重启 Kindle 解决,非常麻烦。
Fonts Hack 法
这种方法主要是指安装 Fonts Hack,这个升级包也可在上文提到的 MobileRead 里的那个帖子中下载到所需文件。下面简单说一下步骤和不足:
- 安装 Fonts Hack。即把对应你的 Kindle 版本型号的
update-fonts-*.bin
放到 Kindle 根目录并在 Kindle 中选择Update your Kindle
。 - 再次连接 Kindle,能够看到根目录多了一个
linkfonts
目录,在 fonts 子目录中即可看到一堆字体,其中Sans-*.ttf
和Serif-*.ttf
是阅读书籍时用到的拉字字符字体文件,而CJK.ttf
是中日韩统一表意文字用到的字体,中文字体自然也在里面了,这就是平时看到的简陋的无衬线中文字体。 - 把
CJK.ttf
替换成优质衬线中文字体如方正准雅宋。 - 在
linkfonts
目录中新建一个名为reboot
的空文件并拔掉 Kindle 可以实现 Framework 重启或者直接从 Kindle 中选择Restart your Kindle
以应用新字体。
这样操作之后,所有的中文字体(阅读界面、目录界面、状态栏)都已经是调用了自定义字体了,但是,这些字体是没有任何样式可言的,全部只有 Regular。而如果把原生字体如 Sans-Regular.ttf
、Serif-Regular.ttf
等换成对应样式的衬线中文字体,又会面临拉丁字符非常丑陋的问题(即上文“目的列表”中第 5 条无法实现)
四、选好你的字体
在正式开工之前,还是再讲一下字体吧。我向来对字体比较挑剔的,原来用 Windows 的时候 GDI++ 是必不可少的东西,不渲染浑身不爽;后来用 Linux 了,则与 /etc/fonts/local.conf
搏斗了好久……现在用了 Kindle 了,面对着与 LCD 完全不同的 E-Ink 屏幕,对字体的挑剔就又上升了一个台阶……
非常幸运的是,在以中文为母语的 Kindle 用户中,对字体很挑剔的不只我一个,这位博主的博文《Kindle 3的字体、行距、边距》便是一篇很好的关于 Kindle 选字体的文章,讲得头头是道,且配图清晰动人,强烈建议大家去围观。这里简要地归纳总结一下我对字体(尤其是简体中文字体)的几点看法:
- 总原则是:CRT、LCD 等低 ppi 屏幕上阅读大量文字请使用无衬线字体;在印刷品上阅读大量文字请使用衬线字体。
- Windows Vista 之前的 Windows 一直用的中易宋体(衬线字体),实在是不该。好在 Vista 之后改成微软雅黑(无衬线字体)了。长时间在 CRT、LCD 上阅读衬线字体非常容易疲劳,不信你找篇长文章用五号字的“华文楷体”阅读试试……
- 印刷品上衬线字体比无衬线字体看着不易疲劳,所以大部分报纸上正文都是小五号报宋体(衬线字体),只有标题为了题目才会用无衬线字体。
- Kindle 由于采用了 167 ppi 的高 ppi 的 E-Ink 屏幕,比电脑屏幕的
72 ppi90-120 dpi 高出一倍多了(引用来源),比报纸的 100-150 dpi 也高出一些,所以完全可以当作印刷品对待,所以应该使用衬线字体。
- 在低 ppi 的电脑屏幕上,推荐使用无衬线中文字体,比如微软的商业字体“微软雅黑”,自由开源的“文泉驿徽米黑”、“文泉驿正黑”也是不错的选择。
- 在高 ppi 的 Kindle 的 E-Ink 屏幕上,推荐使用衬线中文字体,比如方正雅宋系列里的“方正准雅宋”。如果你习惯在 Kindle 上看小字体的话,你甚至可以选择“方正报宋”“汉仪报宋”这样的适合小字号的笔画很细的衬线字体。(报纸上用的就是这样的字体)
再恶毒地“抨击”一下几个字体(以下为个人观点,观点不同者请无视):
- 华文楷体对于大量文字来说是个失败的字体……不解释……很难理解为什么有人会拿它做成 PDF 电子书。上次看到舍友在 Tablet S 上看华文楷体的 PDF 《盗墓笔记》,震惊了……那个字密密麻麻的,非常恶心。
- 中易宋体是一个非常落后的点阵字体,它太古旧了。由于是点阵的,所以没有 hinting 信息,bug 多多,只是由于微软和 Windows 的关系,横行霸道了许多年,至今仍可在一些老顽固的 XP 电脑上看到。
- 微软雅黑和苹果丽黑,在电脑屏幕上算是比较成功的字体,但这只是因为它们为低 ppi 优化过!用在 Kindle 上是很不合适的,可是有些电子书制作者在做 PDF 电子书时候依然选择微软雅黑作为字体……实在是不该。
说了这么多,你现在可以在本节开头的图片中选择合适的字体了吧?非衬线字体直接不考虑了……我的选择是:
如果你习惯看报纸并且想在正文看更小的字体的话,主字体可以选择“汉仪报宋”或者“方正报宋”。
大部分字体在网上搜索一下名字即可找到下载地址,但是“华文中宋斜”和“华文中宋粗斜”这两个字体并不好找,因此我把它们打包了一下,可以点此下载。
五、开始优化字体
前面的准备工作做了那么多,实际上真正的优化过程步骤却并不多,像是前面介绍的两种不完美方法的结合。
更改 Locale
这个步骤是为了让目录界面不出现□□□□。方法就是在目录界面,按 Enter 键,然后输入下面三行 debug 代码,每行按 Enter 结束,然后再按 Enter 再打开新的输入框。
;debugOn #打开 debug 模式 ~changeLocale zh-CN.utf8 #更改 Local 为 zh-CN.utf8 ;debugOff #关闭 debug 模式,可以不输入
这个命令是大小写不敏感的,我区分大小写只是为了好看……另外,在 debug 模式开启的时候输入
~help
可以查看有哪些 debug 命令哦。
执行完这三行命令之后,是需要重启才能应用的,不过先别急着重启,越狱的时候一起重启吧。
越狱
这个不用说了吧,是装软件的前提。从上文那个 MobileRead 链接中下载 update-jailbreak-*.zip
,并解压出对应你的机器的版本的 update_jailbreak_*_install.bin
文件,放到 Kindle 的根目录中,然后在 Kindle 的 Settings
页面中,按 Menu,选择 Update your Kindle
,等待两分钟左右,即可完成越狱,并且由于已经重启了,上一步的 Locale 也就生效了。这时 Kindle 的根目录中应该已经多出了 linkjail
这个目录了。在 Kindle 的内部文件系统中,相应的目录已经被换成了符号链接,目标就是这个 linkjail
,我们可以通过修改 linkjail
中的文件来达到修改 Kindle 内部文件系统文件的目的。
安装 Fonts Hack
依然是在那个链接中,下载 update-fonts-*.zip
,解压出对应版本的 update_fonts_*_install.bin
文件,放到 Kindle 的根目录中,在 Kindle 的 Settings
页面中,按 Menu,选择 Update your Kindle
,等待两分钟左右,即可完成安装。
复制自定义字体
这时再连接 Kindle,便可发现根目录下多了 linkfonts
目录,同样,这也是 Kindle 内部文件系统中某些符号链接的目标,在 linkfonts/fonts
目录下,可以看到一堆字体。请把你准备好的四个中文字体文件(普通、粗体、斜体、粗斜体)复制到 linkfonts/fonts
目录下,保持字体原来的文件名也是这样的,不过为了方便下文引用,最好把它们命名成下面这样,另外,不要用中文名……
CJK_Regular.ttf
→ 普通字体,用于正文的显示CJK_Bold.ttf
→ 粗体字体,用于粗体的显示CJK_Italic.ttf
→ 斜体字体,用于斜体的显示CJK_BoldItalic.ttf
→粗斜字体,用于粗斜体的显示
注意:这个目录中还有一个 CJK.ttf
, 它是 Droid Sans Fallback,即 Android 中默认的中文字体(无衬线!),是 Fonts hack 用来代替原生的中文字体的,理论上删除它,然后引用别的字体也是没有关系的,但是由于 Fonts hack 的一些保险装置,删除它之后会导致 Fonts hack 自动失效,所以还是留着它吧,不引用它就好了。
更改配置文件
上一步已经把所需要用到的四个字体复制到 linkfonts/fonts
目录了,但是它们是不会被自动使用的,需要更改配置文件让 Kindle 去使用它们。
打开 linkfonts/etc
目录,可以看到一堆字体的配置文件。Linux 桌面版用户对这些文件应该很熟悉了……我们要动刀的是 fonts.properties, fonts.properties-3, fonts,properties-3-nocondensed
这三个文件。
注意:这三个文件都是 Unix/Linux/OS X 的 LF 换行格式,千万别用 Windows 自带的“记事本”去编辑保存它!否则会变成 CR+LF 的换行格式!Windows 用户请使用 Notepad++ 去编辑,或者下载我编辑好的文件。
这三个文件的内容大同小异,是在不同的阅读模式下的字体渲染设置。主要是改 # international font support
这一行后面的一些内容。默认是这个样子的:
# international font support code2000.0=I18N.ttf code2000.plain=I18N.ttf jpan.0=CJK.ttf jpan.plain=CJK.ttf jpan.1=CJK.ttf jpan.bold=CJK.ttf kore.0=CJK.ttf kore.plain=CJK.ttf kore.1=CJK.ttf kore.bold=CJK.ttf hant.0=CJK.ttf hant.plain=CJK.ttf hant.1=CJK.ttf hant.bold=CJK.ttf hans.0=CJK.ttf hans.plain=CJK.ttf hans.1=CJK.ttf hans.bold=CJK.ttf
可以看出,最上面一段是对符号字体(这是最后一个 Fallback,关于 Fallback 的顺序,请参见这个帖子)进行设置,不用修改,后面四段内容分别对日文、谚文、正体中文和简体中文进行了设置,格式如下:
[字符集].[样式]=[字体文件名]
“字符集”无非 CJK (目前还没有支持 V ——喃文哦),而样式则是有八种的,比如系统原生 Serif 的设置:
# Serif font definition # serif.0=Serif_Regular.ttf serif.1=Serif_Bold.ttf serif.2=Serif_Italic.ttf serif.3=Serif_BoldItalic.ttf serif.plain=Serif_Regular.ttf serif.bold=Serif_Bold.ttf serif.italic=Serif_Italic.ttf serif.bolditalic=Serif_BoldItalic.ttf
可以看出有 0, 1, 2, 3, plain, bold, italic, bolditalic
八种,并且应该是两两对应的。明白了这一点,就很容易了,把刚才那四段定义 CJK 字体的内容改成这模样就行了:
# international font support code2000.0=I18N.ttf code2000.plain=I18N.ttf jpan.0=CJK_Regular.ttf jpan.1=CJK_Bold.ttf jpan.2=CJK_Italic.ttf jpan.3=CJK_BoldItalic.ttf jpan.plain=CJK_Regular.ttf jpan.bold=CJK_Bold.ttf jpan.italic=CJK_Italic.ttf jpan.bolditalic=CJK_BoldItalic.ttf kore.0=CJK_Regular.ttf kore.1=CJK_Bold.ttf kore.2=CJK_Italic.ttf kore.3=CJK_BoldItalic.ttf kore.plain=CJK_Regular.ttf kore.bold=CJK_Bold.ttf kore.italic=CJK_Italic.ttf kore.bolditalic=CJK_BoldItalic.ttf hant.0=CJK_Regular.ttf hant.1=CJK_Bold.ttf hant.2=CJK_Italic.ttf hant.3=CJK_BoldItalic.ttf hant.plain=CJK_Regular.ttf hant.bold=CJK_Bold.ttf hant.italic=CJK_Italic.ttf hant.bolditalic=CJK_BoldItalic.ttf hans.0=CJK_Regular.ttf hans.1=CJK_Bold.ttf hans.2=CJK_Italic.ttf hans.3=CJK_BoldItalic.ttf hans.plain=CJK_Regular.ttf hans.bold=CJK_Bold.ttf hans.italic=CJK_Italic.ttf hans.bolditalic=CJK_BoldItalic.ttf
注意:这后面的字体名是可以改的,由于我在上一步的时候已经把自定义的字体名改成这模样了,所以是这样填的,如果你用的是其他的文件名的话,请对应修改。
正如上文所说,有 fonts.properties, fonts.properties-3, fonts,properties-3-nocondensed
这样三个文件,都要做类似的修改。修改完了之后用 Unix 的 LF 换行格式保存。
对于不想装 Notepad++ 的 Windows 用户或是懒人,这里有一份我已经改好的配置文件,解压后覆盖即可……不过前提是你的自定义字体文件名和我的命名方式一样。点此下载:fonts-conf-wzyboy.tar.gz
。
重启 Kindle 的 Framework
这时候算是基本大功告成了,重启 Kindle 即可应用新字体。不过 Kindle 的完全重启(Settings - Restart your Kindle
)时间有点长,所以 Fonts hack 中提供了只重启 Framework 的方法,即在拔掉 Kindle 之前,在 linkfonts
目录下面新建一个名为 reboot
的空文件。如果 Windows 用户不方便新建无扩展名的空文件的话,可以原地复制粘贴一下 autorebooot
这个文件然后再重命名为 reboot
,它就是一个空文件……
这个文件建立之后,再拔掉 Kindle,就会看到屏幕左下角有一行字 Restarting framework...
过会儿就会重启完成,应用新字体了。这样比完全重启方便一些,也更快一些。
换回拉丁字体
上文说了,由于我不仅要在 Kindle 上阅读中文书籍,还会阅读英语和德语的书籍,所以对拉丁字体的要求也比较高。而 Fonts hack 把原生的拉丁字体给换掉了!Serif(衬线)字体由 PMN Caecilia 换成了 Droid Serif,而 Sans Serif(无衬线)字体则由经典的 Helvetica 换成了 Droid Sans。后者的替换我没意见,反正我不用无衬线字体的,而前者的替换……令人发指。Droid Serif 实在是太丑了,跟中易宋体中的拉丁字符有得一拼……绝对不如原生的 PMN Caecilia 好看,所以我要换回去。有与我类似需要的同学可以继续读下去,不看英文书的可以跳过……
换回去的方法挺简单,在 linkfonts/backups
下面那些 Caecilia
开头的文件就是原生的 Serif 字体了。这里我被弄糊涂过,经过一些试验,我确认那八个字体中只有四个是原来的拉丁字体,另外四个带 Cond
字样的是紧密版的(即在 Aa 中选择 condensed
之后调用的字体)。对应关系如下:
Caecilia_LT_75_Bold.ttf → Serif_Bold.ttf Caecilia_LT_76_Bold_Italic.ttf → Serif_BoldItalic.ttf Caecilia_LT_66_Medium_Italic.ttf → Serif_Italic.ttf Caecilia_LT_65_Medium.ttf → Serif_Regular.ttf
按照这样的对应关系把它们复制、替换掉 linkfonts/fonts
里的字体,然后再用上一节“重启 Kindle 的 Framework”中的方法,即可应用新字体。
六、成果
于是,就这样,搞定了。
再一张:
如截图所示,连目录中也是中文衬线字体(状态栏里的标题也是),也有各种样式的区别。为此我特意做了一个 mobi 文件,用来检验成果:Lorem ipsum – wzyboy.mobi.tar.gz
如果你在完成上面的所有步骤之后,也能显示出这样的画面,那么,你成功了:
但是始终觉得截图不能显示出 Kindle 真正的美丽,照片才行……为此我拍了好多张像本章章首图那样的照片……真的是像纸一样清晰可读。
七、尾声
我花了近一个月去折腾,又花了三天时间写成本文,算是符合“用心写作”的概念了吧。这是博客搬家到 VPS 之后的第一篇文章,会是对 VPS 的一次压力测试吗?希望是的。
后续报道:这篇文章带来的访问量让我那脆弱且配置不当的 VPS 宕机十几次……重新配置了一下,似乎好一些了。
希望这篇文章对越来越多的 Kindle 中文用户有用。
欢迎转载,转载请注明出自:http://wzyboy.im/post/736.html。谢谢合作。
八、拾遗
这一节是后来添加的。
补充:如想在 Kindle Keyboard 上输入中文,可参考《Kindle 3 安装中文输入法》。目前只能用拼音……不能用五笔。
补充2:Kindle 默认的页边距有点大,可以在 calibre 的 Kindle Collections 插件中修改。也可以参照这篇 wiki 的方法进行修改,注意换行符。
补充3:有不少评论反映做如上更改之后,一些杂志的页眉小字及日期设置时“上午/下午”字样还是方框问号的样子,我在本文的 access.log 里无意中发现了这两篇帖子:《(原创)攻克Kindle最后的乱码—-杂志页眉|音标|符号及实现中文斜体和粗斜体显示》和《解决Kindle所有乱码简易教程》,能解决这个问题,不过涉及到系统字体的整合,喜欢折腾的同学可以试一下。