韩文字符的位置无关比较

position-independent comparison of Hangul characters

我正在编写一个 python3 程序,该程序必须处理各种书写系统的文本,包括韩语(韩语),并且我在比较不同位置的相同字符时遇到问题。 对于那些不熟悉 Hangul 的人(我也不是很了解它),这个脚本具有将音节字母组合成方块的几乎独特的功能。例如'ㅎ'发音为[h],'ㅏ'发音为[a],音节'hah'写为'핳'(如果您的系统无法呈现韩文:第一个h显示在左上角,a 在右上角,第二个 h 在它们下面的中间)。 Unicode 通过为每个辅音设置两个不同的条目来处理此问题,具体取决于它是出现在音节的开头还是结尾。例如,前一个音节被编码为“\u1112\u1161\u11c2”。 我的代码需要比较两个字符,如果它们只是位置不同,就认为它们相等。这不是简单比较的情况,即使应用 Unicode 规范化也是如此。有办法吗?

您将需要使用定制版本的 Unicode 归类算法 (UCA),为相同的音节分配相同的权重。 UCA technical report 描述了韩文排序的一般问题。

幸运的是,ICU library has a set of collation rules that does exactly this: ko-u-co-search – Korean (General-Purpose Search); which you can try out on their demo page. To use this in Python, you will either need use a library like PyICU,或者实现 UCA 并支持 ICU 规则文件格式(或者让您编写自己的规则)的软件。

我是 Python jamo(韩文字母称为 jamo)的开发者。一种简单的方法是将所有 jamo 代码点转换为它们各自的韩文兼容性 jamo (HCJ) 代码点。 HCJ是jamo字符的显示形式,所以辅音的声母和韵母是同一个码位。

例如:

>>> import jamo
>>> initial, vowel, final = jamo.j2hcj('\u1112\u1161\u11c2')
>>> initial == final
True

内部完成此操作的方法是使用从 Unicode 规范复制的查找 table。