【问题标题】:Breaking down a Hangul syllable into letters (jamo)将韩文音节分解为字母 (jamo)
【发布时间】:2016-12-24 00:54:52
【问题描述】:

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

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

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

【问题讨论】:

    标签: java unicode character unicode-normalization


    【解决方案1】:

    基本上,分解韩文 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 jamos,或在 U+3131 到 U+318E 范围内的扩展 jamos)可分解为简单 jamos 对的可通过小型表查找(取自包含韩文规范分解对的主 UCD 表)进行处理。

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

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

    请注意,某些 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 jamo (如果您插入一个前导的 Hangul V 填充符(未渲染的控件),则在孤立的 T jamo 之前)可以变得良好。这有时用于音译一些以元音开头的非韩语单词,但通常韩语使用(并呈现)其字母表的最后一个辅音(IOSEUNG,前导或尾随)来表示缺失的 L jamo。

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

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

    【讨论】:

      【解决方案2】:

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

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

      韩文分解算法也在Section 3.12 of the Unicode Standard (from page 142)中给出;并且由于规范化也会影响其他非韩文字符,因此您应该熟悉UAX #15 中 Unicode 规范化的一般原则和形式。

      【讨论】:

      • 非常感谢,这正是我想要的。我担心我必须创建自己的算法来分解音节。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-06-12
      • 1970-01-01
      • 2015-03-27
      • 2023-03-29
      • 1970-01-01
      • 1970-01-01
      • 2016-11-09
      相关资源
      最近更新 更多