Zamiana pojedynczych znaków

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.

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]

http://gist.github.com/93045 - simple yet powerful

tczubinski: ta wersja działa Ci z nowymi railsami?

Z właściwym sobie refleksem nadchodzę z odsieczą :wink:

@drogus

wymaga kilku poprawek i bezie dzialac. zmienil sie ActiveSupport::Multibyte::Chars