首先我们要理清一个概念,大多数日文游戏使用Shift-JIS(简称sjis,或cp932,cp932其实是sjis的超集)编码,这种编码缺少很多汉化所需的简体中文字符,如果直接写入中文就会出现我们常说的乱码。
因为sjis是针对日文的一套编码规则,它的编码规则中存在一部分汉字,但是还有许多汉字是不存在的,给汉化带来了极其不友好的现象。
当然也有一些引擎除外,比如krkr、新版BGI、新版artemis、ty等等引擎,他们因为支持utf8或utf16这些编码,所以根本不用担心会出现乱码现象。
故在翻译一部gal时就出现了两种主流解决方案:第一种是汉化主流,第二种是AI主流。
第一种就是我们传统的编码修改:它的核心思想就是将游戏的编码系统从日文的sjis修改为支持中文的gbk编码。gbk支持绝大部分中文、日文字符,但是也有严重的缺点,那就是gal中常用的♪、♡等符号在sjis编码中支持,但在gbk中不支持,只能删掉或者映射。
但是修改游戏为gbk的情况较为复杂,难度较高,有时还会出现很多问题需要处理。
既然编码修改这么复杂,那我们不改变游戏原有的sjis编码不就行了吗,我们知道,sjis编码里面有许许多多奇怪的字符,那些字符在中文显示时完全用不到,哎那我们是不是可以想到,既然在中文显示时完全用不到,那我们是不是可以以此来“欺骗”游戏建立一个新规则,将一个不支持的汉字“映射”到一个在sjis编码中存在但不常用的字符的码位上。
打个比方啊,比如“你”这个字符在sjis编码中是不存在,那么我们就找个sjis编码中存在但不常用的字符比如“凜”,让“你”这个字符占据“凜”的码位。
假如我们翻译了一个文本“你好”,如果直接sjis封回原游戏,只会显示“好”而不会显示“你好”,但是如果我们码表映射了后,再sjis封回后就会显示成“凜好”。

那么日繁又该怎么变成简体呢,就需要我们的日繁字体了,也就是你们经常看见的带有cnjp后缀的字体。既然“你”这个字符占据了“凜”的码位,那么我们再变回去啊,这就是一种很取巧的方式,游戏读取码位时以为要显示“凜”,但从我们提供的字体中找到了“你”的字形并显示出来。
当然这个例子是SE里面自带的映射表,绝大多数的ai翻译补丁用的都是此通用映射表,但是也有少部分补丁用的是补丁作者自己的动态映射,字体具有唯一性。
那么又该怎么让游戏去读取这个字体呢,就要用到我们的hook了,通过劫持原游戏的字体函数让其游戏读取我们的字体,进而让其显示简体。

那么字体又该怎么造呢,首先需要一个映射表,还有就是伪造字体的代码页(Charset)为128,将其伪造成日文字体使其游戏能够正常调用该字体,如果没伪造的话那么就算劫持了字体游戏也是无法发生变化的。还有就是关于字体的兼容性问题,可能会去头掐尾或者扁平化,这时候需要修复字体的度量,一般来说黑体的兼容性最好,所以修复标准可以按照黑体的度量来进行修改修复或者自己不断进行调优测试。
GalError
这么厉害
这么厉害
这么厉害
还得是?