440 字
2 分钟
关于韩文输入的原理
因为冒险岛的更新改动总是从韩服开始进行,所以我们不得不盯着韩服的动态,一些图像识别不出来的文字我们会尝试打出来,再拿去翻译。
在这个过程中,我用的都是在线的韩语输入法,在使用的时候我注意到,韩语文字都是“拼”出来的,比如“셩”,是由“ㅅ”、“ㅕ”和“ㅇ”这三个部分组成的。
经过查阅发现,韩文还真是拼出来的,逻辑相当简单,韩文把三个部分分别命名为“初声”(19 个)、“中声”(21 个)和“终声”(28 个)。
所以理论上可以拼出 19 * 21 * 28 = 11172
个字,注意是理论上,因为实际在输入法中打不出那么多,毕竟键盘上的键位也有限。
虽然打不出来,但 Unicode 中是包含了所有的韩文文字的,从 U+AC00
开始,往下数 11171 个,他们的排列方式是这样的:
初1中1终1、初1中1终2...初1中1终28、初1中2终1......初19中21终28
对于开发者,看到这种排列其实就心里有数了,这就是三维数组的遍历,把三个部分分别看做 x、y、z 的话,那么知道 xyz,计算一个文字 Unicode 的方法就是:
const unicode = 0xAC00 + (x * 21 + y) * 28 + z
同理,知道一个文字,计算各部件的组合也是可行的:
function toIndex(char: string) {
const charCode = char.charCodeAt(0)
if (isNaN(charCode) || charCode < 0xAC00 || charCode > 0xD7A3) {
throw new Error('...')
}
const code = charCode - 0xAC00
const z = code % 28;
const temp = Math.floor(code / 28);
const y = code % 21;
const x = Math.floor(code / 21);
return { x, y, z };
}