Java 将韩语音节分解成字母(jamo)

Java 将韩语音节分解成字母(jamo),java,unicode,character,unicode-normalization,Java,Unicode,Character,Unicode Normalization,我正在开发一个处理韩语句子的程序,我需要一种将音节或块分解成字母的方法。对于那些不懂韩语的人来说,一个音节由2-4个字母(jamo)组成,创造了数千种不同的组合。我想做的是把这些音节分解成构成它的字母 我能够通过比较第一个字母的Unicode值和该范围内的相关字母来获得第一个字母,即以x字母开头的音节在y范围内。然而,我找不到其余的信 这是一个包含韩语音节Unicode值的表:韩语音节分解(例如퓛→ ᄑ+ᅱ+ᆶ)通过Java.text.Normalizer类在Java中完成: String s

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

我能够通过比较第一个字母的Unicode值和该范围内的相关字母来获得第一个字母,即以x字母开头的音节在y范围内。然而,我找不到其余的信


这是一个包含韩语音节Unicode值的表:

韩语音节分解(例如
→ <代码>ᄑ+
+
)通过
Java.text.Normalizer
类在Java中完成:

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

文中还给出了韩语分解的算法;由于规范化也会影响其他非韩语字符,您应该熟悉Unicode规范化的一般原则和形式。

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

  • 从代码点的标量值中减去0xAC00(在U+AC00和U+D7A3之间,而不是您所说的U+D7AF之间)
  • 将之前的差值除以28,然后:
    • 如果第一个rest为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之间)
可分解为成对简单Jamo的其他韩语字母(在U+1113和U+11F9范围内,不包括上面返回的3个范围内的简单L、V和T Jamo,或在U+3131到U+318E范围内的扩展Jamo中)可以通过小表查找进行处理(取自主UCD表,其中包含韩语的规范分解对)

该算法以Unicode标准化,只是为了避免在UCD表内将10584个韩国语预合成字符(即预合成的韩国语LV或LVT音节)的规范分解映射到UCD中禁止的三元组(L,V,T simple jamo),或映射到一对(L,V simple jamo)或一对(LV音节,T simple jamo)

因此,UCD表格仅列出第一个和最后一个预合成的LV或LVT字符,这些字符可通过算法进行分解;它们具有所有相同的字符属性(除了UCD的辅助表格中列出的“L/V/T/LV/LVT”类型,特定于韩语)

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

通常在格式良好的韩国语音节中,V jamo(或元音)只能出现在以L开头的jamo(辅音)之后,而T结尾的jamo(辅音)只能出现在V jamo(元音)之后

但也有一些例外情况可以强制使用格式良好的韩国语音节:如果插入一个前导的韩国语V填充词(未呈现控件),则缺少的L jamo(在独立的V jamo之前)可以格式良好;如果插入一个前导的韩国语V填充词(未呈现控件),则缺少的V jamo(在独立的T jamo之前)可以格式良好。这有时用于翻译一些以元音开头的非韩国语单词,但韩国人通常使用(并呈现)字母表的最后一个辅音(loseung、leading或training)来表示缺少的L jamo

最后,(L*,V*,T*)格式良好的韩国语音节后面可以跟着一些声调标记(在音节右侧用一个正方形表示的点)音节方格在韩语中是标准的:所有的L*水平对齐,所有的V*水平对齐,所有的T*水平对齐,然后L*块在方格的左侧,V*块在右侧,最后的T*块在(L*,V*)块的下方。声调标记分别添加到(L*,V*,T*)块的右侧韩语方格,包含同一音节的所有Jamo


韩国语也有“半宽”变体的字母,这些字母不是严格意义上的“韩国语”。半宽字母只包括L或LV“半音节”,没有T“半音节(它们被L半音节代替):这些半宽字母不会呈现在韩国语正方形中,它们可以以任何顺序出现,就像拉丁字母一样。半宽LV音节也可以分解为半宽L和半宽V音节,但由于这会放大它们的呈现方式,因此这种分解在规范上并不等价(半宽LV音节被视为不可断连字,类似于拉丁语中的AE或IJ连字;这种分解仅用于在韩语排序中对它们进行排序,这在韩语字母表的主要排序顺序中可见)。这些半宽字母是为了在旧终端或旧打字机上使用而编码的,因为字符集必须受到限制(因为不可能呈现所有可能的韩国语方块)。

非常感谢,这正是我想要的。我担心我必须创建自己的音节分解算法。