替换Ruby中的重音字符

Eup*_*r08 2 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')
Run Code Online (Sandbox Code Playgroud)

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

cre*_*mno 6

e?您的name实际上是两个不同的Unicode 码点:U + 0065(LATIN SMALL LETTER E)和U + 0301(COMBINING ACUTE ACCENT).

p 'e?'.each_codepoint.map{|e|"U+#{e.to_s(16).upcase.rjust(4,'0')}"} * ' ' # => "U+0065 U+0301"
Run Code Online (Sandbox Code Playgroud)

但是é你的正则表达式只有一个:U + 00E9(LATIN SMALL LETTER E WITH ACUTE).维基百科有一篇关于Unicode等价的文章.在官方的Unicode FAQ还包含有关这一主题的说明和信息.

如何在Ruby中规范化Unicode字符串取决于其版本.它自2.2以来具有Unicode规范化支持.您不必像以前的版本那样需要库或安装gem(这里是概述).用(或U + 0065和U + 0301)组成(U + 00E9)或用作参数来规范化简单name调用:String#unicode_normalize:nfc:nfkce?é

name = File.basename(Dir.getwd)
name.unicode_normalize! # thankfully :nfc is the default
name.downcase!
Run Code Online (Sandbox Code Playgroud)

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

我也很喜欢,甚至应该指出的是,转换éeüu原因的信息丢失.例如,德语单词Müll(trash)将被转换为Mull(mull/forest humus).