首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何替换Ruby中的重音拉丁字符?

如何替换Ruby中的重音拉丁字符?
EN

Stack Overflow用户
提问于 2008-10-22 12:03:23
回答 10查看 45K关注 0票数 79

我有一个ActiveRecord模型Foo,它有一个name字段。我希望用户能够按名称搜索,但我希望搜索忽略大小写和任何重音。因此,我还存储了一个要搜索的canonical_name字段:

代码语言:javascript
复制
class Foo
  validates_presence_of :name

  before_validate :set_canonical_name

  private

  def set_canonical_name
    self.canonical_name ||= canonicalize(self.name) if self.name
  end

  def canonicalize(x)
    x.downcase.  # something here
  end
end

我需要填写“这里的某物”来替换重音字符。还有比这更好的吗?

代码语言:javascript
复制
x.downcase.gsub(/[àáâãäå]/,'a').gsub(/æ/,'ae').gsub(/ç/, 'c').gsub(/[èéêë]/,'e')....

而且,因为我不是在Ruby1.9上,所以我不能在我的代码中放入那些Unicode文字。实际的正则表达式看起来会丑陋得多。

EN

回答 10

Stack Overflow用户

回答已采纳

发布于 2008-11-15 14:18:52

Rails已经有一个用于规范化的内置代码,你只需要使用它来规范化你的字符串,形成KD,然后像这样删除其他字符(即重音符号):

代码语言:javascript
复制
>> "àáâãäå".mb_chars.normalize(:kd).gsub(/[^\x00-\x7F]/n,'').downcase.to_s
=> "aaaaaa"
票数 63
EN

Stack Overflow用户

发布于 2011-08-23 19:47:20

ActiveSupport::Inflector.transliterate (需要Rails 2.2.1+和Ruby1.9或1.8.7)

示例:

>> ActiveSupport::Inflector.transliterate("àáâãäå").to_s => "aaaaaa"

票数 98
EN

Stack Overflow用户

发布于 2013-12-15 02:33:35

更好的方法是使用I18n:

代码语言:javascript
复制
1.9.3-p392 :001 > require "i18n"
 => false
1.9.3-p392 :002 > I18n.transliterate("Olá Mundo!")
 => "Ola Mundo!"
票数 43
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/225471

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档