好友
阅读权限10
听众
最后登录1970-1-1
|
本帖最后由 zixijian 于 2019-11-12 10:40 编辑
最近一直在手机上玩MUDs文字游戏,
主要是使用两款终端,juicessh跟termux。
其实大部分的国外app及软件作者都没有考虑过中文,
其一,标准互不兼容、混乱;
其二,他们看不懂,没有办法review。
所以中文各种叠字,显示异常。
本文就是使用了最简单的方法来偷天换日,
达到欺骗app的目的。
我首先使用APK编辑器查看了Juicessh的目录结构,
我敏锐的发现
目录:assets/fonts/DroidSansMono.ttf
存放了字体,
于是我大胆的实验直接找一个别的字体改个名,
用APK编辑器的简单编辑功能替换来试一试,
果然可行。
经过几十种字体的替换,
推荐字体有iosevka、hack、文泉驿等宽微米黑。
我又发现了几个问题点,
大部分中文字体显示都十分异常,
经过一番查证,发现了一些字体相关的点。
举个例子说明一下。
比如有一个符号,是个横杠。-
这个横杠,在有些国家和地区,它的宽度是一个 ASCII 字符宽度(我们只讨论等款字体的渲染效果),但是在有些国家和地区,它的宽度是两个 ASCII 字符宽度。
这里面有很多原因,因为大家都知道,语言、文字,是一个国家主权的体现。所以每个国家(或地区)对自己国家的语言文字都有相应的规范。你们找本小学生新华字典翻翻附录就知道我们汉字的规范了。
但是这些字符的含义却是一致的。
所以在编码处理的时候,就有两种处理方式:
1,把它们当成两个字符
2,把它们当成一个字符
如果当成两个字符,那么你想要一个字符宽度的时候,你就用一个字符宽度的那个版本,你想用两个字符宽度的时候,你就用两个字符宽度的版本。
大家肯定猜到了,这就是「全角」和「半角」说法的来历。
这个方案的好处是,字符本身就明确了宽度,你想用全角,就用全角,想用半角,就用半角。
但是缺点也很明显:
1,浪费编码空间
2,带来不必要的全半角转换工作
比方说,引号有两个版本,一个全角,一个半角,那你替换的时候就得把两种都处理一遍,不然会有遗漏。而且很多人还经常用错,用混,都很麻烦。
所以就有了另一个方案:单字符宽度和双字符宽度,都用同一个编码,但是在显示渲染的时候,再决定如何渲染。
那么显示的时候到底该怎么渲染呢?有几种方案:
1,始终渲染为双字符宽度
2,始终渲染为单字符宽度
3,渲染为单字符宽度,但是后面加一个空格,这样占位仍然是两个字符宽度,不会引起纵向的错位
4,根据上下文自动渲染
使用同样字体进行比对,
发现juicessh采用了方案2,termux采用了方案1。
使用apk编辑器查看smali,
也能找到该字体的一些相关,
由于我不熟悉,就采用了最简单的替换方案。
实际上也并不完美,只是算得上能用。
针对字符宽度控制的疑问,
我已发帖到求助区,这或许涉及到了我不了解的维度。
|
免费评分
-
查看全部评分
|
发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。 |
|
|
|
|