【发布时间】:2014-07-15 10:37:20
【问题描述】:
我正在尝试在 IPA 字符串中插入空格,例如将ɔ̃wɔ̃tɨ 变成ɔ̃ w ɔ̃ t ɨ。使用 split/join 是我的第一个想法:
s = ɔ̃w̃ɔtɨ
s.split('').join(' ') #=> ̃ ɔ w ̃ ɔ p t ɨ
我通过检查结果发现,带有变音符号的字母实际上被编码为两个字符。经过一番研究,我找到了 UnicodeUtils 模块,并使用了 each_grapheme 方法:
UnicodeUtils.each_grapheme(s) {|g| g + ' '} #=> ɔ ̃w ̃ɔ p t ɨ
这很好用,除了倒置的短标记。代码将̑a 更改为̑ a。我尝试了标准化(UnicodeUtils.nfc,UnicodeUtils.nfd),但无济于事。我不知道为什么each_grapheme 方法对这个特殊的变音符号有问题,但我注意到在 gedit 中,短号也被视为一个单独的字符,而不是波浪号、重音符号等。所以我的问题是如下:有没有直接的归一化方法,即将Latin Small Letter A和Combining Inverted Breve组合成Latin Small Letter A With Inverted Breve?
【问题讨论】:
-
您确定您使用的是正确的 ȃ 吗?我对这些字符没有经验,但使用 Unicode +U0203 从the Wikipedia page 复制了一个,当我运行
puts UnicodeUtils.each_grapheme("ɔ̃ȃɨ").to_a.join(' ')时,它确实正确输出了"ɔ̃ ȃ ɨ"。 -
事实上,我确定我用错了 ȃ。我从文件中读取输入数据并且无法控制其内容。我想用正确的版本 (U+0203) 替换所有出现的 ȃ (U+0311 + U+0061)。也许可以在文本编辑器中做到这一点,但我不知道如何。
-
您可以将其替换为:
"̑a".gsub("\u0311\u0061", "\u0203")。开头的"̑a"是由U+0311和U+0061组成的。gsub将替换为单个字符,正确的版本(从技术上讲,您可以使用sub,但如果您想替换较大文本中的所有匹配项,请使用gsub)。 -
感谢您的帮助。不幸的是,我在文本中发现了更多“独立”的变音符号。使用 gsub 的组合太多,所以我决定简单地删除所有 Combining Diacritical Marks。这是一个相当蹩脚的解决方法(而且我丢失了一些语音信息),但我想不出更好的方法。也许有一种方法可以检查一个字符是否是一个组合字符?
-
注意组合字符应该在之后基础字符。在您的问题中,您说
̑a已转换为̑ a,但该字符应显示为ȃ,因此我怀疑您的示例具有组合标记before 基本字符,这将解释你看到的行为。
标签: ruby unicode diacritics unicode-normalization phonetics