Wszystko byłoby naprawde dobrze gdyby nie kodowanie Oracla CP1250. Niestety nie mogę go zmienić a muszę jakoś używać polskich znakow.
Otóż moj problem polega na tym iż Oracle musi być kodowany cp1250 (korzystają z niego inne aplikacje) a railsy muszą używać utf-8 gdyż inaczej wykładają się javascripty pod IE (a ajax i rjsy to polowa aplikacji). Szukam rozwiązania tego problemu.
Najskuteczniejsze według mnie byloby wymuszenie konwersji znakow podczas polaczenia (w obie strony) gdyż jak juz pisalem zmiana kodowania żadnej ze stron nie wchodzi w gre (chyba ze ktos zna dobre rozwiazanie problemu js w CP1250 pod IE)
Może jest coś o czym nie wiem wiec dziekuje z gory za wszelkie rady
no na razie po ciezkim dniu grzebania wypracowalem takie moje smieszne rozwiazanie
caly projekt (w radrailsie jest tworzony w kodowaniu cp1250 ) takim jak baza i wykorzystuje after_filter:
Filters added to this controller will be run for all controllers in the application.
Likewise, all the methods added will be available for all controllers.
class ApplicationController < ActionController::Base
after_filter :convert_response
def convert_response @response.body = Iconv.new(“UTF-8”,“cp1250”).iconv(@response.body)
end
def cv(value)
return Iconv.new(“cp1250”,“UTF-8”).iconv(value)
end
end
funkcja cv jest wywolywana dla kazdego przychodzacego parametru przyjmujacego nazwy z polskimi znakami
(na szczescie to aplikacja biznesowa i ma glownie cyferki :))
dzieki temu calosc html pojawiajaca sie na stronie jest kodowana w utf8 co zadowala javascripty i mnie bo do bazy wrzucane sa stringi kodowane w cp1250.
ps jezeli ktos zna dobry sposob przekonwertowania przychodzacych request_parameters to czekam na info
tu wybralem reczne kodowanie wybranych parametrow gdzyz nie wszystkie musza byc skonwertowane a poza tym nie wiem jak przypisac wartosc do request_parameters
Co z zaproponowanym przeze mnie rozwiązaniem? Czy z jakiegoś powodu nie działało?
Popełniłem kiedyś taką funkcję, ale nie zalecam jej używania. Sugeruję zainteresować się jednak standardowymi metodami rozwiązywania problemów z kodowaniem (wspomniany artykuł).
[code=ruby]
before_filter :convert_from_utf8
protected
def convert_from_utf8
converter = Iconv.new( ‘cp1250’, ‘utf-8’ )
p = convert_hash_tree( params, converter )
self.params = p
end
private
def convert_hash_tree( node, converter )
res = nil
if node.class.name == ‘HashWithIndifferentAccess’
res = HashWithIndifferentAccess.new()
node.each { |k, v| res[k] = convert_hash_tree( v, converter ) }
elsif node.class.name == ‘String’
begin
res = converter.iconv( node )
rescue Iconv::IllegalSequence => e
raise ‘Fuck! - Illegal sequence in [’ + node.to_s + ‘]’
end
else
res = node # Leave as it is
end
return res
end[/code]
To jest ustawienie dla Oracla, a nie RoR: NLS_LANG environment variable i wygląda na to, że to jeden z lepszych sposobów na kodowanie Oracle w Twoim przypadku.