替换Ruby中的重音字符

时间:2015-08-07 15:38:43

标签: ruby

我有一个脚本或Ruby,当我尝试替换重音的charcater gsub时,我不能使用它:

我的floder名称为"Réé Ab"

name = File.basename(Dir.getwd)
name.downcase!
name.gsub!(/[àáâãäå]/,'a')
name.gsub!(/æ/,'ae')
name.gsub!(/ç/, 'c')
name.gsub!(/[èéêë]/,'e')
name.gsub!(/[ìíîï]/,'i')
name.gsub!(/[ýÿ]/,'y')
name.gsub!(/[òóôõö]/,'o')
name.gsub!(/[ùúûü]/,'u')

输出"réé ab",为什么重音字符在那里?

1 个答案:

答案 0 :(得分:6)

中的name实际上是两个不同的Unicode codepointsU+0065LATIN SMALL LETTER E)和U+0301({{1} })。

COMBINING ACUTE ACCENT

然而,正则表达式中的p 'é'.each_codepoint.map{|e|"U+#{e.to_s(16).upcase.rjust(4,'0')}"} * ' ' # => "U+0065 U+0301" 只有一个:U+00E9é)。维基百科有一个关于Unicode等价的articleofficial Unicode FAQ还包含有关此主题的说明和信息。

如何在Ruby中规范化Unicode字符串取决于其版本。自2.2以来它有Unicode normalization support。您不必像以前的版本(here's an overview)那样需要库或安装gem。要使用LATIN SMALL LETTER E WITH ACUTEname作为参数将String#unicode_normalize简洁的电话:nfc标准化为:nfkc(U + 0065和U + 0301)至 (U + 00E9):

é

当然,您也可以在正则表达式中使用已分解的字符,但这可能不适用于其他文件系统,然后您还需要规范化:NFD或NFKD才能分解。

我也想或甚至应该指出,将name = File.basename(Dir.getwd) name.unicode_normalize! # thankfully :nfc is the default name.downcase! 转换为ée转换为ü会导致信息丢失。例如,德语单词Müll(trash)将被转换为Mull(mull / forest humus)。