我有一个脚本或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"
,为什么重音字符在那里?
在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
:nfkc
e?
é
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).
归档时间: |
|
查看次数: |
785 次 |
最近记录: |