Jam*_*sen 70 ruby unicode activerecord ruby-on-rails utf-8
我有一个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
Run Code Online (Sandbox Code Playgroud)
我需要填写"这里的东西"来替换重音字符.还有什么比这更好的了
x.downcase.gsub(/[àáâãäå]/,'a').gsub(/æ/,'ae').gsub(/ç/, 'c').gsub(/[èéêë]/,'e')....
Run Code Online (Sandbox Code Playgroud)
而且,就此而言,由于我不在Ruby 1.9上,我不能将这些Unicode文字放在我的代码中.实际的正则表达式看起来会更加丑陋.
Mar*_*den 87
ActiveSupport::Inflector.transliterate (需要Rails 2.2.1+和Ruby 1.9或1.8.7)
例:
>> ActiveSupport::Inflector.transliterate("àáâãäå").to_s
=> "aaaaaa"
une*_*ist 57
Rails已经内置了规范化,你只需要使用它来规范化你的字符串以形成KD,然后删除其他字符(即重音符号),如下所示:
>> "àáâãäå".mb_chars.normalize(:kd).gsub(/[^\x00-\x7F]/n,'').downcase.to_s
=> "aaaaaa"
Run Code Online (Sandbox Code Playgroud)
小智 38
更好的是使用I18n:
1.9.3-p392 :001 > require "i18n"
=> false
1.9.3-p392 :002 > I18n.transliterate("Olá Mundo!")
=> "Ola Mundo!"
Run Code Online (Sandbox Code Playgroud)
fgu*_*len 18
我尝试了很多这种方法,但他们没有达到这些要求中的一个或几个:
一直是这样的:
# coding: utf-8
string.tr(
"ÀÁÂÃÄÅàáâãäå??????Çç????????Ðð????ÈÉÊËèéêë??????????????????????ÌÍÎÏìíîï?????????????????????????Ññ?????????ÒÓÔÕÖØòóôõöø??????????????????Šš???????ÙÚÛÜùúûü??????????????Ýýÿ??Ÿ????Žž",
"AAAAAAaaaaaaAaAaAaCcCcCcCcCcDdDdDdEEEEeeeeEeEeEeEeEeGgGgGgGgHhHhIIIIiiiiIiIiIiIiIiJjKkkLlLlLlLlLlNnNnNnNnnNnOOOOOOooooooOoOoOoRrRrRrSsSsSsSssTtTtTtUUUUuuuuUuUuUuUuUuUuWwYyyYyYZzZzZz"
)
Run Code Online (Sandbox Code Playgroud)
你必须修改一点字符列表以尊重'ñ'字符,但这是一件容易的事.
Dor*_*ian 12
我的回答:String#参数化方法:
"Le cœur de la crémiére".parameterize
=> "le-coeur-de-la-cremiere"
Run Code Online (Sandbox Code Playgroud)
对于非Rails程序:
安装activesupport:gem install activesupport然后:
require 'active_support/inflector'
"a&]'s--3\014\xC2àáâã3D".parameterize
# => "a-s-3-3d"
Run Code Online (Sandbox Code Playgroud)
我认为你可能不会真正走下那条道路.如果您正在开发具有这类信件的市场,您的用户可能会认为您是一种...... 点子.因为'å'在用户的任何意义上都不接近'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/
分解字符串并从中删除非间距标记.
irb -ractive_support/all
> "àáâãäå".mb_chars.normalize(:kd).gsub(/\p{Mn}/, '')
aaaaaa
Run Code Online (Sandbox Code Playgroud)
如果在.rb文件中使用,您可能还需要此选项.
# coding: utf-8
Run Code Online (Sandbox Code Playgroud)
normalize(:kd)这里的部分在可能的情况下分离出变音符号(例如:"n with tilda"单个字符被分成n后跟一个组合变音符号的tilda字符),然后该gsub部分删除所有变音字符.
| 归档时间: |
|
| 查看次数: |
41016 次 |
| 最近记录: |