通用方法简化字符串,去除变音符号

3
I希望您能够提供一种方法来去除变音符号和文本中的其他字母标记,并以适合文本搜索索引的方式简化它。
为了去除变音符号,我已经找到了以下方法:
  • PHP相关问题:1, 2
  • Java相关问题:1,相关内容:2
  • Bash相关问题:1
  • .Net相关问题:1, 2
  • Javascript相关问题:1
  • Python相关问题:1
我想要一个通用的解决方案,与语言无关。(此外,这个参考列表可能对某些人有用。)
去除变音符号可以处理äöüò等。但我还想要:
ø → o Я → R Ł → L ɲ → n æ → a (它也可以是“ae”,但在我的情况下,“a”更合理,因为我还想用“a”替换“ae”)
例如,我想索引名称Røyksopp,有时也出现为Röyksopp,只需在简化名称Royksopp下进行即可。或者KoЯn应该是KoRn。
2个回答

3

一些ICU的魔法:

echo "ë ö ø Я Ł ɲ æ å ñ 開 당" | uconv -x any-name | perl -wpne 's/ WITH [^}]+//g;' | uconv -x name-any | uconv -x any-latin -t iso-8859-1 -c | uconv -f iso-8859-1 -t ascii -x latin-ascii -c

产量
e o o A L n ae a n ki dang

这里使用了命令行工具uconv,但同样可以使用ICU的Java、C或C++ API进行操作,而且ICU对于几乎所有语言都有绑定。

请注意,将Я转换为A是正确的行为。你想要的不是Unicode定义该字符的方式——应该谴责KoЯn滥用它。


我刚刚发现:有两个Я:Я 'CYRILLIC SMALL LETTER YA' (U+044F)和ᴙ 'LATIN LETTER SMALL CAPITAL REVERSED R' (U+1D19)。也许我应该在我的搜索索引中包含几个变体。 - Albert
FYI:uconv位于icu4c Homebrew软件包中,但必须手动链接到/usr/local/bin来源)。 - nloveladyallen
这不是原始问题中的内容,但是在包含没有字母的变音符号(如´(锐音符)和¨(分音符/双点音符))的输入上会失败。 - nloveladyallen
@nloveladyallen,嗯,你说得对。幸运的是,只需在最终命令中添加-c,这些就完全消失了。我会编辑答案... - Tino Didriksen

0
在与Python相关的问题中,至少有一种通用解决方案可以去除变音符号:
  • 将Unicode字符串转换为其长标准形式(具有字母和变音符号的单独字符)
  • 删除其Unicode类型为“变音符号”的所有字符
然而,这对于ø不起作用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接