将韩文音节分解为字母 (jamo)

Breaking down a Hangul syllable into letters (jamo)

我正在开发一个处理韩语句子的程序,我需要一种将音节或块分解为字母的方法。对于那些不懂韩文的人来说,一个音节由 2-4 个字母 (jamo) 组成,创造出数千种不同的组合。我想做的是将这些音节分解成组成它的字母。

我能够通过将其 Unicode 值与该范围内的关联字母进行比较来获得第一个字母,即以 x 字母开头的音节在 y 范围内。但是,我找不到其余的字母。

这是一个 table 包含韩文音节的 Unicode 值:http://jrgraphix.net/r/Unicode/AC00-D7AF

韩文音节分解(例如 + + )在 Java 中通过 java.text.Normalizer class:

String s = Normalizer.normalize("\uD4DB", Normalizer.Form.NFD);

Section 3.12 of the Unicode Standard (from page 142); and since normalisation also affects other, non-Hangul characters, you should familiarise yourself with the general principles and forms of Unicode normalisation in UAX #15中也给出了韩文分解的算法。

基本上,分解 Hangul LVT 或 LV 音节的算法是:

  • 从代码点的标量值中减去 0xAC00(在 U+AC00 和 U+D7A3 之间,而不是你所说的 U+D7AF),
  • 将前面的差值除以 28,然后:
    • 如果第一个休息为0,则没有T jamo;
    • 否则将 0x11A7 添加到第一个休息(1 到 27 之间)以获得最终的 T jamo(在 U+11A8 和 U+11C2 之间);
  • 将前面的商除以 21,并且:
    • 将 0x1161 添加到第二个休息(0 到 20 之间)以获得内侧(或最终)V jamo(在 U+1161 和 U+1175 之间);
    • 将 0x1100 添加到第二个商(介于 0 和 17 之间)以获得领先的 L jamo(介于 U+1100 和 U+1112 之间);

其他韩文字母(在 U+1113 和 U+11F9 范围内,不包括上面返回的 3 个范围内的简单 L、V 和 T 拼音,或在 U+3131 到 U+ 范围内的扩展拼音318E) 可以分解成简单的 jamos 对,可以通过一个小的 table 查找来处理(取自包含 Hangul 的规范分解对的主 UCD table)。

该算法已在 Unicode 中标准化,只是为了避免在 UCD 内部映射 table 将 10,584 个韩文预组合字符(即预组合的韩文 LV 或 LVT 音节)规范分解为三元组(L、V、 T simple jamos), 在UCD中禁止使用,或成对(L,V simple jamos)或成对(LV音节,T simple jamo)。

因此,UCD table 仅列出算法可分解的第一个和最后一个预组合 LV 或 LVT 字符;它们也具有所有相同的字符属性(除了它们的 "L/V/T/LV/LVT" 类型,它列在 UCD 的辅助 table 中,特定于韩文)

请注意,某些 LL 或 TT 预组合辅音被视为简单的 jamos,不可分解。这是韩文中双辅音 ("SANG" jamos) 的传统,但这在 jamo 字母表的主要排序顺序中可见,其中双辅音紧跟在单辅音之后,所有 L 或 LL jamos 排序在前面所有 V jamos,以及所有 V jamos 都排在 T 和 TT jamos 之前。

通常在完整的韩语音节中,V jamo(或元音)只能出现在 L 前导 jamo(辅音)之后,T 尾随 jamo(辅音)只能出现在 V jamo(元音)之后。

但也有一些强制使用格式良好的韩文音节的例外情况:如果插入前导韩文 V 填充符(未呈现的控件),缺失的 L jamo(在孤立的 V jamo 之前)可能会变得格式正确,而缺失的 V如果您插入一个前导的 Hangul V 填充符(未呈现的控件),jamo(在孤立的 T jamo 之前)可以变得格式良好。这有时用于音译一些以元音开头的非韩语单词,但通常韩语使用(并渲染)其字母表中缺少的 L jamo 的最后一个辅音(IOSEUNG,前导或尾随)。

最后,(L*, V*, T*) 格式良好的韩文音节后面可以跟一些声调标记(写在单个方块中的音节右侧的点)。 (L*, V*, T*) 音节方块的布局顺序是韩语的标准:L*全部水平对齐,V*全部水平对齐,T*全部水平对齐,然后L*块在左边正方形,右侧的 V* 块,以及 (L*, V*) 块下方的最终 T* 块。声调标记分别添加到包含相同音节的所有 jamos 的 (L*, V*, T*) 韩文方块的右侧。

韩语也有 "half-width" 个不严格 "Hangul" 的字母变体。半角字母仅包括 L 或 LV "half-syllables" 并且没有 T" 半音节(它们被 L 半音节代替):这些半角字母不呈现在 Hangul 方块中,它们可以以任何顺序出现,就像拉丁字母一样。半角 LV 音节也可以分解为半角 L 和半角 V 音节,但是由于这会扩大它们的呈现方式,因此这种分解在规范上不是等效的(半角 LV 音节被认为是牢不可破的连字,类似于拉丁语中的 AE 或 IJ 连字;这种分解仅用于在韩语排序规则中对它们进行排序,这在韩语字母表的主要排序顺序中可见。这些半角字母被编码用于必须限制字符集的旧终端或旧打字机(因为不可能呈现所有可能的韩文方块)。