unicode字符_使Windows系统正常显示Unicode规范CJK全部扩展区字符的技巧

  Unicode在今年3月推出13版本,其中中日韩统一表意文字(CJK Unified Ideographs)正式推出至扩展G区。然而,在日常使用当中,莫说录入并显示扩展G区内容,连扩展B-F区的诸多字符都无法在使用者的操作终端显示,此情既有行业规范与资源方面的原因(常规字体不支持扩展区众多字符编码),也有使用者技能水平欠缺的掣肘。对于要用到这些区域字符的用户而言,就没有所谓常用字与生僻字的说法,反正就是让能使用的字符越多越好,本文以Windows系统来讲讲如何实现。

  先看两幅对比图(均按宋体显示)。

e985a58ad723f292f11ca151ffed4d60.png

㈠未采用本文所讲方法对扩展区字符实施支持的情况

94358593a8b2c79aec42f55e462da502.png

㈡已采用本文所讲方法对扩展区字符实施支持的情况

  本文仅提供解决方法,至于当中的理论(如单一字体文件最大支持字形数量、Fontlink与字体SurrogateFallback的区别、CJK扩展各区在编码平面上的布局等等)就不描述了。

  第一步就是找支持扩展区的字体文件。扩展A-B区的好找,对于Vista及之后的Windows来讲,其自带字体及其默认配置已经能完整显示CJK基本区与扩展A区所有字符,并可支持大部分扩展B区的字符。截止目前来讲,完整支持扩展A-B区字符的字体不少,但能局部甚至全部支持扩展C-G区的字体凤毛麟角。我这里提供两个:一个是“KaiXinSong(开心宋体)”完整支持扩展B-F区字符,一个是“sim-ch_n5100”完整支持扩展G区字符。字体情况详见下图。

0faac407df6336fa0c2f94b51a583736.png

a4dcb19e56b7559e1e4502007ec6c5b5.png

d6f2353bcb254c70669e7313a2fb8c9b.png

48a684bf24ea3379f3d8a0e062881c75.png

  需要提醒的是,截止目前为止,“开心宋体”网上流传着几个版本,版本号都一样,只有一个支持扩展F区,其它几个仅支持到扩展D区,除了像我这样用工具检验字体的方法之外,比较简单的一个判断方法就是选用文件体积是23451912字节的那个。还有,直接从源发布站点下载的“sim-ch_n5100”字体文件是有问题的,在PC端可正常使用,但在手机端会造成严重问题(下一篇文章《使Android系统正常显示Unicode规范CJK全部扩展区字符的技巧》会提到),需要手动处理一下,方法很简单,随便用一个字体编辑工具(我用《FontCreator》)打开该字体,直接导出生成一个新的字体文件就可以了。

  第二步,在获得字体后将其安装到系统中,方法一大堆,包括直接双击、右键菜单安装等等。到此步骤──还没算结束!此时要使用该字体来显示CJK扩展区字符,就得手动在对应程序中指定该字体。毕竟这两个字体(包括其他支持CJK扩展B-G区的字体)都不是常用字体,程序开发者一般不会指定采用这些字体,而且绝大多数程序不支持调节界面字体,这就需要将这两个字体挂号到系统中或嫁接到常用字体里,行话就称为字体回溯,使在系统默认的文本显示机制中,能自动调用这两个字体。

  简单来讲就是在注册表里做动作,此乃第三步。操作前可按以下路径先备份原来状态。

  • 路径①:

    “[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\LanguagePack\SurrogateFallback]”。

  • 路径②:

    “[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\LanguagePack\SurrogateFallback\字体名]”。

  在这两个路径下分别再建立两个字符串值(已有的话就用新值替换旧值),名为“Plane2”的取值“KaiXinSong”或另一个支持显示字符编码第2平面(CJK扩展B-F区所在)的字体,名为“Plane3”的取值“sim-ch_n5100”或另一个支持显示字符编码第3平面(CJK扩展G区所在)的字体。如图所示(路径②以“SimSun”字体为例)。

f2e3d1587972014605128e7a8b0c441d.png

  XP系统只有路径①,Vista及之后的系统备齐两个路径。两个路径的有效范围与使用优先度是不同的。

  路径①习惯上称为全局型或通用型,路径②则被叫作定向型。以“Plane2”这个项值为例。

  • 情况⑴如果选用的字体具有路径②(即在路径①下拥有它的字体名子项),且其下具有“Plane2”项值,则执行其字体名路径②的“Plane2”策略,直接忽略路径①下的“Plane2”策略,即便路径②的“Plane2”是无效的(如对应标注的字体文件受损不存在)且路径①下的“Plane2”有效也如此。

  • 情况⑵如果选用的字体没有路径②(即在路径①下没有它的字体名子项),或即使具有路径②(即在路径①下拥有它的字体名子项)但其下没有“Plane2”项值,则在Win8及之后的系统直接执行路径①的“Plane2”策略。

  • 情况⑶如果选用的字体没有路径②(即在路径①下没有它的字体名子项),或即使具有路径②(即在路径①下拥有它的字体名子项)但其下没有“Plane2”项值,则在Win7及之前的系统中,如果选用的字体具有简体中文脚本,则直接执行路径①的“Plane2”策略,否则忽略路径①的“Plane2”。

4005a00b8b9fc6e8c2ed9310728c5df5.png

  搞完后,马上生效(已打开窗口的程序需要重新运行才看到效果)。

  当所运行的程序涉及的字符处于字符编码第2平面(CJK扩展B-F区所在)时,不管其设定的原来界面字体是否支持显示该字符,都会根据上述3个情况来调用对应“Plane2”指向的字体,而不是像Fontlink功能那样,原字体不支持显示对应字符才找备选字体去显示。所以,又要提醒一下,若采用的备选字体不恰当,对于某些字符而言,用原字体可以显示,用备选字体不能显示,受制于“Plane2”注册表项的把控,最终效果就是不能显示,比不实施“Plane2”策略更差。

  “Plane3”的道理一样。

  目前主流Windows系统中绝大多数应用程序是支持混合字体(又称字体级联)的。本文所讲内容有效。也有少量程序比较顽固不支持该功能,就不能按本文上面提到的技巧去显示CJK扩展区字符。例如Presto内核的老Opera浏览器对其HTML页面文本就不支持自动字体级联,截止今天为止所有版本的Photoshop在文本图层录入的文字同样不支持字体级联。

  目前这些支持到CJK扩展E-G区的字体大多数是混合字体,即从几个类似又不完全相同的字体里抽出部分字符,再通过作者团队补充一些进去。所以不但美观性大打折扣,即使采用单一字体也会出现不同字体风格的情况。行业现状就这样,将就着,先把文字正确显示,其它方面暂时不要强求了。

462ab4a3bcafd53b7d72864ba1ff8fbb.png

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值