Tomash
August 1, 2008, 11:04am
21
Po przeczytaniu rozwiązań Obiego i innych wypracowaliśmy rozwiązanie brutalne i brzydkie, ale skuteczne:
[code=ruby]class String
def to_ascii_brutal
#foo = self.downcase.strip
foo = String.new(self)
#foo = self.clone #.downcase.strip
foo.gsub!(/[ĄÀ�?ÂÃ]/,‘A’)
foo.gsub!(/[âäàãáäå�?ăąǎǟǡǻ�?ȃȧẵặ]/,‘a’)
foo.gsub!(/[Ę]/,‘E’)
foo.gsub!(/[ëêéèẽēĕėẻȅȇẹȩęḙḛ�?ếễểḕḗệ�?]/,‘e’)
foo.gsub!(/[Ì�?ÎĨ]/,‘I’)
foo.gsub!(/[�?iìíîĩīĭïỉ�?ịįȉȋḭɨḯ]/,‘i’)
foo.gsub!(/[ÒÓÔÕÖ]/,‘O’)
foo.gsub!(/[òóôõ�?�?ȯö�?őǒ�?�?ơǫ�?ɵøồốỗổȱȫȭ�?�?ṑṓ�?ớỡởợǭộǿ]/,‘o’)
foo.gsub!(/[ÙÚÛŨÜ]/,‘U’)
foo.gsub!(/[ùúûũūŭüủůűǔȕȗưụṳųṷṵṹṻǖǜǘǖǚừứữửự]/,‘u’)
foo.gsub!(/[ỳýŷỹȳ�?ÿỷẙƴỵ]/,‘y’)
foo.gsub!(/[œ]/,‘oe’)
foo.gsub!(/[ÆǼǢæ]/,‘ae’)
foo.gsub!(/[Ń]/,‘N’)
foo.gsub!(/[ñǹń]/,‘n’)
foo.gsub!(/[ÇĆ]/,‘C’)
foo.gsub!(/[çć]/,‘c’)
foo.gsub!(/[ß]/,‘ss’)
foo.gsub!(/[œ]/,‘oe’)
foo.gsub!(/[ij]/,‘ij’)
foo.gsub!(/[Ł]/,‘L’)
foo.gsub!(/[�?ł]/,‘l’)
foo.gsub!(/[Ś]/,‘S’)
foo.gsub!(/[ś]/,‘s’)
foo.gsub!(/[ŹŻ]/,‘Z’)
foo.gsub!(/[źż]/,‘z’)
#foo .sub!(/[\s’"\/?.=+&%]$/,’’)
#foo .gsub!(/[\s’"\/?.=+&%]/,’’)
#foo .gsub!(/ +/,’_’)
foo
end
end[/code]
Niestety silnik forum brutalnie zamienił nieasciowe znaki na encje htmlowe. W dużym skrócie chodzi o wymienienie wszystkich możliwych literek, jakie mają zostać wymienione na swoje asciiowe uproszczenia.
Wrzuc to na pastie.org jesli mozesz napewno sie przyda.
tcz
August 4, 2008, 10:43pm
23
Może komuś się też przydać.
[code]require ‘iconv’
require ‘unicode’
class String
def to_ascii
return if self.nil?
self.chars.split(’’).collect { |c| (c[0] <= 127) ? c : translation_hash[c[0]] }.join
end
protected
def translation_hash
@translation_hash ||= setup_translation_hash
end
def setup_translation_hash
accented_chars = "ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛŨÜÝâäàãáäåāăąǎǟǡǻȁȃȧẵặçëêéèẽēĕėẻȅȇẹȩęḙḛềếễểḕḗệḝiìíîĩīĭïỉǐịįȉȋḭɨḯñòóôõōŏȯöỏőǒȍȏơǫọɵøồốỗổȱȫȭṍṏṑṓờớỡởợǭộǿùúûũūŭüủůűǔȕȗưụṳųṷṵṹṻǖǜǘǖǚừứữửựỳýŷỹȳẏÿỷẙƴỵĄĆĘŁŃÓŚŻŹąćęłńóśżź".chars.split('')
unaccented_chars = "AAAAAACEEEEIIIIDNOOOOOxOUUUUUYaaaaaaaaaaaaaaaaaaaceeeeeeeeeeeeeeeeeeeeeeeeiiiiiiiiiiiiiiiiinoooooooooooooooooooooooooooooooooooouuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuyyyyyyyyyyyACELNOSZZacelnoszz".split('')
translation_hash = {}
accented_chars.each_with_index { |char, idx| translation_hash[char[0]] = unaccented_chars[idx] }
translation_hash["Æ".chars[0]] = 'AE'
translation_hash["æ".chars[0]] = 'ae'
translation_hash["Œ".chars[0]] = 'OE'
translation_hash["œ".chars[0]] = 'oe'
translation_hash["ß".chars[0]] = 'ss'
translation_hash
end
end[/code]
teamon
April 10, 2009, 11:28am
24
drogus
April 10, 2009, 4:15pm
25
tczubinski: ta wersja działa Ci z nowymi railsami?
Tomash
April 10, 2009, 4:30pm
26
Z właściwym sobie refleksem nadchodzę z odsieczą
tcz
April 13, 2009, 9:18am
27
@drogus
wymaga kilku poprawek i bezie dzialac. zmienil sie ActiveSupport::Multibyte::Chars