当前位置:  开发笔记 > 后端 > 正文

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

如何解决《如何在Ruby中替换重音拉丁字符?》经验,为你挑选了7个好方法。

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

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

我需要填写"这里的东西"来替换重音字符.还有什么比这更好的了

x.downcase.gsub(/[àáâãäå]/,'a').gsub(/æ/,'ae').gsub(/ç/, 'c').gsub(/[èéêë]/,'e')....

而且,就此而言,由于我不在Ruby 1.9上,我不能将这些Unicode文字放在我的代码中.实际的正则表达式看起来会更加丑陋.



1> Mark Wilden..:

ActiveSupport::Inflector.transliterate (需要Rails 2.2.1+和Ruby 1.9或1.8.7)

例:

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



2> unexist..:

Rails已经内置了规范化,你只需要使用它来规范化你的字符串以形成KD,然后删除其他字符(即重音符号),如下所示:

>> "àáâãäå".mb_chars.normalize(:kd).gsub(/[^\x00-\x7F]/n,'').downcase.to_s
=> "aaaaaa"


至少在Rails3中,String#参数化有效...所以"öüâ".parameterize =="oua"
这很有效,但我必须像Christian一样做`mb_chars`.`foo.mb_chars.normalize(:KD)..gsub(/ [^\x00-\0x7F部分]/N, '')to_s.split`
我试图在Rails应用程序之外的另一个脚本中使用它.我以为它会在`activesupport`中,但在要求之后我仍然会为`normalize`获得一个'NoMethodError`.你知道我需要什么吗?
它是在activesupport中,但你必须这样做:ActiveSupport :: Multibyte :: Chars.new("àáâãäåå").mb_chars.normalize(:kd).gsub(/ [^\x00-\x7F]/N, '').downcase.to_s

3> 小智..:

更好的是使用I18n:

1.9.3-p392 :001 > require "i18n"
 => false
1.9.3-p392 :002 > I18n.transliterate("Olá Mundo!")
 => "Ola Mundo!"



4> fguillen..:

我尝试了很多这种方法,但他们没有达到这些要求中的一个或几个:

尊重空间

尊重'ñ'字符

尊重案例(我知道不是原始问题的要求,但将字符串移动到小写并不困难)

一直是这样的:

# coding: utf-8
string.tr(
  "ÀÁÂÃÄÅàáâãäå??????Çç????????Ðð????ÈÉÊËèéêë??????????????????????ÌÍÎÏìíîï?????????????????????????Ññ?????????ÒÓÔÕÖØòóôõöø??????????????????Šš???????ÙÚÛÜùúûü??????????????Ýýÿ??Ÿ????Žž",
  "AAAAAAaaaaaaAaAaAaCcCcCcCcCcDdDdDdEEEEeeeeEeEeEeEeEeGgGgGgGgHhHhIIIIiiiiIiIiIiIiIiJjKkkLlLlLlLlLlNnNnNnNnnNnOOOOOOooooooOoOoOoRrRrRrSsSsSsSssTtTtTtUUUUuuuuUuUuUuUuUuUuWwYyyYyYZzZzZz"
)

- http://blog.slashpoundbang.com/post/12938588984/remove-all-accents-and-diacritics-from-string-in-ruby

你必须修改一点字符列表以尊重'ñ'字符,但这是一件容易的事.



5> Dorian..:

我的回答:String#参数化方法:

"Le cœur de la crémiére".parameterize
=> "le-coeur-de-la-cremiere"

对于非Rails程序:

安装activesupport:gem install activesupport然后:

require 'active_support/inflector'
"a&]'s--3\014\xC2àáâã3D".parameterize
# => "a-s-3-3d"



6> Jonke..:

我认为你可能不会真正走下那条道路.如果您正在开发具有这类信件的市场,您的用户可能会认为您是一种...... 点子.因为'å'在用户的任何意义上都不接近'a'.走另一条路,阅读非ascii方式的搜索.这只是有人发明unicode和整理的案例之一.

一个很晚的PS:

http://www.w3.org/International/wiki/Case_folding http://www.w3.org/TR/charmod-norm/#sec-WhyNormalization

除此之外,我没有理想的方式,整理的链接转到msdn页面,但我把它留在那里.应该是http://www.unicode.org/reports/tr10/



7> Cheng..:

分解字符串并从中删除非间距标记.

irb -ractive_support/all
> "àáâãäå".mb_chars.normalize(:kd).gsub(/\p{Mn}/, '')
aaaaaa

如果在.rb文件中使用,您可能还需要此选项.

# coding: utf-8

normalize(:kd)这里的部分在可能的情况下分离出变音符号(例如:"n with tilda"单个字符被分成n后跟一个组合变音符号的tilda字符),然后该gsub部分删除所有变音字符.


这应该更高。其他解决方案完全剥离了其他字符集(例如,'I18n.transliterate('日本语')#=>“ ???”`)和''日本语'.parameterize#=>“”`。这个答案最符合我的需求,即能够大致匹配标题/作者上的各种数据集。`'日本语àáâãäå'.unicode_normalize(:nfkd).gsub(/ \ p {Mn} /,'')#=>“日本语aaaaaa”`
推荐阅读
路人甲
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有