在Ruby中,如何将ë,à,é,ä等特殊字符转换为e,a,e,a?

Zom*_*ies 4 ruby unicode special-characters

我想要的字符,如转换ë到只是简单的e.我希望转换语言以及人们如何键入城市.例如,大多数人在搜索时实际上键入了Brasilia,而不是Brasília.当像Rueters这样的新闻机构报道巴西利亚时,他们通常将其拼写为巴西利亚.如此反复,只是为了寻找任何宝石(或字符编码数学/方法可能会更好,因为这个问题的答案可以用,以供参考,在其他语言).

这只是为了处理典型的"扩展ASCII"字符集.注意:我正在使用标准的Unicode字符串.

Gab*_*yel 20

你可能正在寻找I18n#transliterate.

宝石在这里,安装gem install i18n.

例:

irb(main):001:0> require 'i18n'
=> true
irb(main):002:0> I18n.enforce_available_locales = false
=> false
irb(main):003:0> I18n.transliterate("ë,à,é,ä")
=> "e,a,e,a"
Run Code Online (Sandbox Code Playgroud)


Ste*_*fan 11

使用Ruby 2.2开始,就String#unicode_normalize标准化 unicode字符串.NFKD表单分隔字符和标点符号:

'ë'.unicode_normalize(:nfkd).chars
#=> ["e", "?"]
#     ^    ^
#   char  punctuation
Run Code Online (Sandbox Code Playgroud)

由于该字符是有效的ASCII码点而标点符号不是,因此可以用它来删除后者:

'ë,à,é,ä'.unicode_normalize(:nfkd).encode('ASCII', replace: '')
#=> "e,a,e,a"
Run Code Online (Sandbox Code Playgroud)

  • 这不适用于所有字符 `"ąłż".unicode_normalize(:nfkd).encode('ASCII', Replace: '') => "az"`。`I18n.transliterate` 对于某些语言效果更好。 (2认同)