Wymuszenie kodowania dla przeglądarki

Aby wymusić określone kodowanie dla wszystkich szablonĂłw najlepiej ustawić w pliku app/controller/application.rb następujący kod:

class ApplicationController < ActionController::Base before_filter :set_charset def set_charset @headers["Content-Type"] = "text/html; charset=utf-8" end
Jest to odpowiednik w php: header(“Content-type: text/html; charset=utf-8”); z tą rĂłżnicą że to działa nie dla jakiejś jednej strony ale dla wszystkich stron1. Oczywiście dla przyzwoitości należy w kodzie html2 do sekcji … dodać:

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

Ale na samym znaczniku html lepiej nie polegać. Znacznie pewniejszym sposobem zmuszenia przeglądarki do przełączenia się w kodowanie jakie chcemy jest użycie wysłania nagłĂłwkĂłw Content-type… tak jak w przykładzie na początku.

1 Rails w odrĂłżnieniu od PHP jest kompletnym frameworkiem z eleganckim rozdzieleniem wartwy prezentacji od logiki aplikacji.

2 W przypadku RailsĂłw najlepiej używać layoutĂłw i ustawić to globalnie w pliku app/views/layouts/main.rhtml; (nazwa pliku jest tu dowolna).

Co ma framework do jĂŞzyka? To tak, jakbyÂś napisaÂł, Âże „Pan Tadeusz” w odró¿nieniu od jĂŞzyka niemieckiego jest rymowanym trzynastozgÂłoskowcem.

masÂło maÂślane … a nie trzynastozgÂłoskowiec…
uÂżytkownik moÂże mieĂŚ “dziwnÂą” przeglÂądarkĂŞ ustawionÂą na sztywno na np, koreaĂąski …
i zamiast poslkich krzaczkĂłw zobaczy … hmmmm … niewiadomoco … :wink:

podana wyÂżej metoda wymusi na przeglÂądarce uÂżytkownika prawidÂłowe wyÂświatlanie aplikacji
i tyle …

pozdrawiam
Alex

Tutaj jest uno pico problemo, gdy mamy jakąś bardziej zaawansowaną aplikację używamy w niej automatycznej generacji xml (np rss/atom przez rxml), javascriptu (przez rjs) jak i automatycznie generowanych obrazków (różne wykresy itp). Wymienione powyżej rozwiązanie nadaje tym wszystkim tym rzeczom Content-Type = “text/html; charset=utf-8”. więc nie miejmy pretensji ze coś nie działa. Rozwiązaniem tego problemu jest filtrowanie po generacji ( after_filter ), wtedy rails nadał już content-type wysyłanej treści więc możemy dokleić do niego “; charset=utf-8” :slight_smile: Będzie to wyglądać następująco

class ApplicationController < ActionController::Base after_filter :set_charset def set_charset content_type = @headers["Content-Type"] || 'text/html' @headers["Content-Type"] = "#{content_type}; charset=utf-8" if content_type =~ /^text\// end end
Jak widzicie ten kod dopisuje “; charset=utf-8” tylko do plików textowych (czyli pasujących do regexpa /^text//)

EDIT: Można tez pokusić się o zamianę text/html na application/xhtml+xml dla klientów to obsługujących:after_filter :set_ctype def set_ctype if @request.env["HTTP_ACCEPT"].index('application/xhtml+xml') && @headers["Content-Type"] =~ /^text\/html/ ctype = @headers["Content-Type"].sub('text/html','application/xhtml+xml') @headers["Content-Type"] = ctype #lub od razu @headers["Content-Type"].sub!('text/html','application/xhtml+xml') end end
Jak widac przyrównuję to do /^text/html/, tak dla świętego spokoju, żeby interpreter nie wywoływal metody sub [czy sub!] na darmo :wink:
Pamiętajmy jednak że w tym przypadku wszystkie szablony i layouty muszą być zgodne z xml, inaczej niektóre przeglądarki [np. Opera] bedą nam krzyczeć o blędach w parsowaniu xml

nie smiga mi to tak jak powinno…

powiem wiecej - na tej stronie (ror.pl) tez nie widze PL znakow tylko jakies krzaki…

(Mac OS X, Safari, defaultowo jezyk angielski ale inne polskie strony dzialaja jak nalezy)

Wszystkie powinny krzyczeć i o ile wiem tak robią.

Czesc

Nie moge wymusic kodowania dla przegladarki na ISO-8859-2 strona wyświetla sie w utf-8

1.W przegladarce ISO-8859-2 jest ustawione jako domyślne

  1. w ApplicationController wsadzilem obie metody podane w powyrzszych przykladach

[code ruby] …
before_filter :set_header
after_filter :set_charset

def set_charset
content_type = @headers[“Content-Type”] || ‘text/html’
@headers[“Content-Type”] = “#{content_type}; charset=iso­8859­2” if content_type =~ /^text//
end

def set_header
@headers[‘Content­Type’] = ‘text/html; charset=iso­8859­2’
end
…[/code]
mam kontroller “finders_controller”

w Views/layouts mam finders.html.erb a w nim :

[code ruby]…

...[/code] w kontrolerze "finders_controller" mam
layout 'finders'

Nic nie pomaga

def set_header @headers['Content'] = 'text/html; charset=iso-88592' end
Spróbuj, może pomoże.

BTW Iso używało się w czasach kamienia łupanego. Teraz jest UTF :stuck_out_tongue:

[quote=Tubis] def set_header @headers['Content'] = 'text/html; charset=iso-88592' end
Spróbuj, może pomoże.

BTW Iso używało się w czasach kamienia łupanego. Teraz jest UTF :P[/quote]
???

Przeciez mam ta metode wkleilem ja u gory ?

no wiem ze UTF ale dostelem taki wymog

Sądze ze poprostu teraz w Raisach 2.0~ tzeba to jakoś inaczej wymusić

Komuś się udało ?

Masz, ale źle. Ty masz “iso88592”, a ma być “iso-8859-2”.

Nie ja mialem wlasnie ‘iso-8859-2’ kolega podal ‘iso88592’

tak czy siak nie dziala ! sprawdzales u siebie to radarek ?

EDIT :

ok ma byc :

response.headers

zamiast

@headers

Nie ja mialem wlasnie ‘iso-8859-2’ kolega podal ‘iso88592’[/quote]
Ok, nie wczytałem się w temat i nie zauważyłem.

Nie muszę sprawdzać bo wiem, że ma działać :). Kodowanie to kwestia następujących (poprawnych ustawień):

  • kodowanie edytora
  • kodowanie nagłówków http
  • kodowanie html w head
  • kodowanie połączenia bazy jak i samych tabel (mysql) (jeśli używamy bazy oczywiście)

[quote=ISIS]EDIT :

ok ma byc :

response.headers

zamiast

@headers [/quote]
Uhm, wszyscy skupili się na samych wartościach kodowania i nie zauważyli tego :). No cóż, ważne, że działa.