里约大冒险1土豆:【原创】字体替换解决方案

来源:百度文库 编辑:九乡新闻网 时间:2024/04/28 01:27:46
字体下载修正为:http://bbs.themex.net/showthread.php?t=16823856

首先要明白一点:任何方案都不可能是完美的,即使是微软原始的字体,也不可避免出现兼容性问题。我们的目标不是制作一种完美的字体解决方案,而是在现有的条件下让字体尽可能地完善。本文并无贬低其他解决方案的意思,如果文字有任何冒犯之处,敬请谅解。按照问题的严重级别,列出了替换SIMSUN.TTC需要引起注意的几点:
1) 是否因替换字体后引发死机或软件字符映射错误

微软原生的字体首先是符合中国国家标准(GB2312、GBK)的,否则不会允许在中国销售。因此,我们一般使用的软件用到的字符集一般都会满足GB2312或GBK的标准。现在出现的较多的丽黑改宋体替换后死机、软件不能运行等问题与此关系最大。因为丽黑原本就不是在大陆销售的字体,尽管显示效果不错(对不起,许多人认为它很Perfect,我只是说它good,因为我不大喜欢满屏都是很粗的字体),因兼容标准的问题,我不会使用它。爱好丽黑的朋友需要在美丽与稳定之间作出权衡。我推荐使用“微软雅黑”来替换系统的宋体,不是说其他字体不如雅黑,但一个值得肯定的原因是:雅黑是除了原生宋体外兼容性最好的字体了
2) 是否撑大对话框且对话框信息是否显示完整
设计得好的软件不会因为字体撑大对话框而导致信息显示不完整,例如Windows的一系列对话框,在替换字体后尽管对话框被撑大,但其中的信息是完整的,不想某些低劣的界面设计(例如众所周知的QQ),换一个字体,就出现按钮不见了或按钮与文本框“干涉”的现象。可悲的是,我们中国人使用的最多的软件就是这个QQ,所以我们不得不为了一个糟糕的设计绞尽脑汁去调整我们的字体。

simsun-settings.png
yahei-settings.png

一直以来,使用雅黑修改的宋体导致QQ对话框信息不完整是一个顽疾。宋体单位尺寸为256,雅黑设计为2048。一般来说,如果雅黑的各项参数正好是宋体的8倍(2048/256),则对话框不会被撑大。不幸的是,我们看到的雅黑是一种比宋体扁的字体,它的各项参数严重偏离了这个比值。许多人以为是雅黑的行距比宋体大,这是不对的,恰恰相反,如下图所示,上面的是宋体的参数,下面的是雅黑的,宋体的行距为36,雅黑为0,可见调整行距是一条错误的路。

字体设计时,都有一条“基线”,其纵坐标为“0”,字体的高度就是基线之上的值与基线之下的值之和。在比较两者的过程中,可以发现宋体为220+36=256,而雅黑为2167+536=2703!但在研究过程中发现,所有的中文字符和大部分的英文字母都在-36×8~220×8这个范围之内。一个雅黑字体设计有2703高,但真正有信息的部分仍然是2048,其他的就是空白部分。此时我们明白,为什么雅黑看上去“行距”比宋体大,本质上的原因是字符上下的空白比宋体多而已。因此只需要简单的把图中的2167改成220×8=1760,-536改成-36×8=288即可实现对话框纵向不撑大。为了保险起见,我在其他页面的数字也参考了宋体按比例来调整。

system-props.png

是否此时一切问题都解决了?答案是否定的!眼睛告诉我们,雅黑比宋体要扁,也就是在横向上,雅黑的宽度也不是宋体的8倍。如上图所示,右边的文字信息与边框的距离明显有些大。但横向的调整我没有找到方法,希望能得到高手的指点。幸运的是,我们那个该死的QQ对话框已经正常了。

qq-chat.png

改造到了这一步还没有完成,前面提到“大部分”的英文字母在这个区间内,但仍然有“漏网之鱼”。典型的几个字母:g、j、p、q、y、[、]就会超出下部边界(-288),导致使用这些字母的文本出现“斩脚”现象。我的做法是固定上边界,将下边界拖动到-288附近。此时,改造的大部分工作就完成了。

transform.png

3) 在使用系统固有的英文字体时,是否出现汉字或英文字母过大或过小的现象
上面改造的雅黑,填上原生宋体的信息,就成了我的“雅黑改宋体”了。以前我一直不想用雅黑做界面字体的最重要的原因就是:雅黑的英文字母号称也是“Segoe UI”,但比起真正的Segoe UI来说,差距就太大了,让我看着极不舒服。我们知道Windows系统有一种“字体链接”的技术:就是在使用英文字体时,如果遇到这种字体中没有的字符,就会到注册表相应的位置去找它链接的字体。因此,我们看到许多主题使用Tahoma字体,但实质上Tahoma是不包含中文信息的,我们只要打开注册表编辑器,浏览到这个位置HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\FontLink\SystemLink,会发现一个Tahoma的链接,它的第一行为SimSun.TTC,意思就是遇到中文时,它默认到SIMSUN.TTC文件里去找,如果没有发现这个字,再到第二行的字体里去找……话题扯远了,如果我们把第一行改成没有修改过的微软雅黑,会出现汉字极小而英文很大的现象,但使用上面修改过的雅黑后,一切都正常了,雅黑的汉字与Tahoma的英文能完美的配起来。
毕竟,使用Tahoma有些怪(个人爱好不同),因为Tahoma的英文字母与雅黑的英文字母风格不一致,所以最佳方案是使用Segoe UI,然后仿造Tahoma创建一条注册表信息,这样,英文字母为Segoe UI,中文为雅黑,如果遇上某些软件固定了字体为“宋体”,那么显示的也是雅黑的英文字母,与Segoe UI风格仍然是一致的。
很多人提出一个问题,就是替换掉原生宋体之后,因为修改了字符的纵向区间,会导致中文行间过于紧密,如下图所示:


此时我们就需要发挥字体链接的威力了,修改格式菜单里的字体为Segoe UI,再看看下图的效果:
可以看到,字符行距已经被拉开了,这正是我们需要的结果。

notepad1.png
notepad2.png

4) 对拥有自己单独字体映射的软件是否显示正常
有一些软件有自己单独的字体配置,也就是他们并不使用Windows主题中指定的字体,例如JAVA的GUI程序、比特精灵等,这个时候就可能需要在上面提到的字体链接中进行配置了,例如,比特精灵使用的是TAHOMA,不论界面字体怎么更改,其始终为TAHOMA,如果在字体链接中没有TAHOMA(一般都有,这个是Windows默认的),就会出现乱码。其实,这点在使用GDI++的FreeType进行渲染时可以得到验证,如果不在字体替换中指定“TAHOMA=SIMSUN”,比特精灵的界面就变得其丑无比。如果不使用FreeType,只使用GDI++默认的渲染引擎,这些都没有问题。
5) CMD窗口中的中文是否显示正常
很多字体替换方案只是简单的将修改后的“宋体”复制一份,然后改名为“新宋体”,接着就使用MAKETTC合并成一个SIMSUN.TTC文件,这在一般情况下是没有问题的。但我做了多年的程序员,总喜欢打开CMD窗口进行一些操作,使用这样的字体往往出现中文显示混乱的问题。关键的原因在于,原来的宋体和新宋体带有点阵字体,CMD窗口只能使用这种字体,因此,不能简单的合并。比较安全的做法有两个:一是以前我做的NSIMSUN.TTC,将其中的“宋体”改为“宋体_GB2312”,然后与新宋体合并,这样只需在CMD的属性窗口里配置字体为“新宋体”就可以了;另外一种需要些技巧:既然我们已经使用了改造的宋体,也复制了一份新宋体,并合并了SIMSUN.TTC文件,那么可不可以让CMD窗口使用其他字体呢?答案是可以,但需要在注册表里动点手脚。首先把新宋体改名为“新宋体_GB2312”,用MAKETTC生成一个NSIMSUN.TTC文件,里面只有一个“新宋体_GB2312”,把它复制到字体文件夹;接下来打开注册表编辑器,浏览到HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Console\TrueTypeFont,可以看到里面有一条936的项,它的值就是CMD窗口在简体中文代码页下使用的字体!把它第一行改成“*新宋体_GB2312”,第二行改成“*NSimSun_GB2312”,重启机器后,打开CMD窗口,单击左上角图标,选“属性”,可以看到我们的字体已经可以使用了。

console.png

6) IE中的“纯文本字体”
打开“Internet属性->常规->字体”,显示如下对话框,我们的目的是让纯文本也使用修改后的宋体。这里要关注的是为什么有些字体不会进入“纯文本字体”列表框中。默认情况下,宋体会在左边的列表框中,而新宋体会在右边的列表框中。很多人以为宋体与新宋体完全一样,这句话在这里可以看出不对了。

iefonts.png

要解决这个问题,需要了解什么叫做“等宽字体”,英文为Monospaced Font。简单地说,宋体是宽度可变字体,而新宋体是不可变的,我们只需要在把前面改造的宋体复制一份,填上新宋体的信息,并且把比例设置成“等宽”即可,如下图所示:

nsimsun-settings.png

这样的新宋体与宋体合并之后,就会出现在IE这个对话框的右边了。

7) 软件界面字体是否协调一致
对于追求完美的我们,经常要对某个软件界面上定义的字体使用自己喜欢的字体进行替换。这里要关注的注册表位置是【HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\FontSubstitutes】。前面提到的原因,我把大部分的英文都指向了Segoe UI。可能细心的朋友会发现Courier New是等宽字体,为什么指向不等宽的Segoe UI呢?这个问题的产生是由于在使用了GDI++之后,Courier New导致某些只支持单字节编辑的英文软件出现异常,命名是一个字符“F”拷贝到另外一个窗口后就成了“C”,所以为之。如果要使用等宽字体,可以用更好的Consolas,这个字体就没有出现此类问题。

regwork.png

8) 使用GDI++后是否会出现以上列举的问题
饿着肚子一口气写了上面的文字,最后一个比较重要的话题是GDI++。GDI++会带来字符革命性的效果提升,但同事会带来大量的问题。幸运的是,只使用GDI++而不用FreeType,问题基本上都可以得到解决。因为每个人机器上安装的软件都不一样,所以我的配置可能对你们没有太大的作用,但我要说的是,参考一下论坛上的帖子,使用GDI++会给你一种愉悦的体验!

要做到字体的尽可能完美体现并不容易,还有许多技巧,比如“黑体”的改造等等,有时间在和大家分享。

以上是对近期字体研究的总结,因为我之前的帖子附件占用了太多的空间,而目前我认为已经较完善了的解决方案用到的字体与之前的不太一致,所以暂时无法上传,如果上面的文字对您有帮助,而您又不愿意像我一样花大量的时间去调整字体,只是想要使用我调整好的字体文件,请在下面回复。



好了,总算发完了,回去吃饭去,蚂蚁有空帮我把格式调整一下,谢谢!

我自己修改的“宋体”在【原创】修改自微软雅黑的宋体,用作系统字体后不再不撑大对话框,正式版发布这里可以下载到,由于空间不够,上面提到的一系列修改,包括对新宋体的处理无法进行上传,您可以参考我修改的版本制作您自己的字体。