我有一个脚本或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"
,为什么重音字符在那里?
答案 0 :(得分:6)
é
中的name
实际上是两个不同的Unicode codepoints:U+0065(LATIN 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等价的article。 official Unicode FAQ还包含有关此主题的说明和信息。
如何在Ruby中规范化Unicode字符串取决于其版本。自2.2以来它有Unicode normalization support。您不必像以前的版本(here's an overview)那样需要库或安装gem。要使用LATIN SMALL LETTER E WITH ACUTE
或name
作为参数将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)。