【问题标题】:How to handle Combining Diacritical Marks with UnicodeUtils?如何处理将变音符号与 UnicodeUtils 结合使用?
【发布时间】: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.nfcUnicodeUtils.nfd),但无济于事。我不知道为什么each_grapheme 方法对这个特殊的变音符号有问题,但我注意到在 gedit 中,短号也被视为一个单独的字符,而不是波浪号、重音符号等。所以我的问题是如下:有没有直接的归一化方法,即将Latin Small Letter ACombining 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


【解决方案1】:

我了解您的问题与 Ruby 有关,但我认为问题与 Python 大致相同。一个简单的解决方案是显式测试组合变音符号:

import unicodedata
liste=[]
s = u"ɔ̃w̃ɔtɨ"
comb=False
prec=u""
for char in s:
    if unicodedata.combining(char):
        liste.append(prec+char)
        prec=""
    else:
        liste.append(prec)
        prec=char
liste.append(prec)
print " ".join(liste)
>>>>  ɔ̃  w̃  ɔ t ɨ

【讨论】:

    猜你喜欢
    • 2012-11-08
    • 2021-11-06
    • 1970-01-01
    • 1970-01-01
    • 2018-03-09
    • 1970-01-01
    • 2014-09-10
    • 1970-01-01
    • 2010-10-02
    相关资源
    最近更新 更多