如何在Perl中枚举所有Unicode规范等效序列?

时间:2011-06-21 00:37:06

标签: perl unicode

是否存在标准的Perl模块或函数,给定Unicode Combining Character Sequence(或更一般地,任意Unicode文本字符串),将生成所有规范等效字符串的列表?

例如,如果给出字符U + 1EAD,我想找回所有这些规范等效序列的列表:

0061 0302 0323
0061 0323 0302
00E2 0323
1EA1 0302
1EAD

(我并不特别在意接口是按照USV或utf字符串的数组来说的。)

1 个答案:

答案 0 :(得分:2)

这是XY问题吗?如果你想比较/匹配2个unicode字符串,你担心不同的重音字符编码方式会产生漏报,那么最好的方法是使用Unicode中的一个规范化函数规范化2个字符串。 ::在进行比较或匹配之前进行标准化。

否则会有点乱。

可以使用charnames::viacode(0x1EAD);获取完整的角色名称(对于U + 1EAD,它将是带有CIRCUMFLEX和DOT以下的拉丁文小写字母),以及通过在WITH | AND上分割名称来获取各种组合字符。然后你可以生成基本字符+修饰符和其他修饰符的所有组合(检查它们是否存在!)。此时,您将遇到将全名中的组合字符名称(例如 CIRCUMFLEX )与组合字符实名( COMBINING CIRCUMFLEX ACCENT )进行匹配的问题。可能有这样的规则,但我不知道。

这将是我天真的尝试,可能有更好的方法来做到这一点,但到目前为止还没有人自愿提供信息......