Před časem jsme měli problémy s kódováním češtiny v tomcatu. Při postu a getu se čeština občas pokazila.
Chtěl bych se tedy podělit s fíglem jak to vyřešit.
Problém nebyl v aplikaci, ale v konfiguraci tomcatu.
Na všech verzích tomcatu (4.x a 5.x) je potřeba přidat
-Dfile.encoding=utf-8
do CATALINA_OPTS
(na debianu do /etc/default/tomcat5). Ve windows v Monitor Tomcat
do Configure->Java->Java Options
.
Pokud používáte tomcat 5.x (což je náš případ) musíte přidat i toto
URIEncoding="UTF-8"
do konfigurace connectoru v server.xml
<Connector port="8080" ... URIEncoding="UTF-8" ... />
(více viz. dokumentace u apachů).
Tohle řešení mi bohužel nefungovalo na Tomcatu 5.5 (.12 + Struts). Našel jsem i řešení pomocí filtru, které nakonec zafungovalo (uvedeno jako alternative):
http://wiki.apache.org/tomcat/Tomcat/UTF-8
Díky, díky, díky Ó VELIKÝ Tomcat GURU….
Právě jsem ušetřil 3 months práce, můžu jít na držkovou a pivo…. 🙂
Ještě také někdy pomáhá použít ve formuláři:
<form accept-charset=“utf-8″>
Tyhle rady jsou nesmyslné. U všech javových webových aplikací se musí udělat dvě věci:
– specifikovat výstupní kódování stránky
– specifikovat vstupní kódování HTTP požadavku
První se dělá voláním metody request.setCharacterEncoding(„utf-8“), umístění nejlépe ve filtru mapovaném na všechny URL.
Druhé se dělá při specifikaci typu výstupu, tj. response.setContentType(„text/html; charset=utf-8″)
U TomCatu 5.5 je ještě potřeba při předávání parametrů přes GET nastavit konfigiraci Coyote konektoru v souboru server.xml, musí se přidat useBodyEncodingForURI=“true“.
V souboru http://www.ietf.org/rfc/rfc3986.txt je napsáno:
Non-ASCII characters must first be encoded according to UTF-8 [STD63], and then each octet of the corresponding UTF-8 sequence must be percent-encoded to be represented as URI characters.
Zde je definováno, že všechny znaky v URL musí být kódovány jako UTF-8. Ale to všechny prohlížeče nedělají (žádný?).
Když máte stránku v UTF-8 tak se tento problém neprojeví. Pokud tedy použijete jednoduchý POST, data jsou kódována jako GET a tím pádem můžou být kódovány špatně.
Když ovšem použijete enctype=“multipart/form-data“, řeknete, aby se data neposílala v URL, ale jako příloha HTTP požadavku,
kde už je kódování uvedeno.
Ještě k -Dfile.encoding=utf-8:
Myslím, že to bylo nutné pro Tomcat 4.x, protože asi používal String.getBytes();
Souhlasím, že toto již dnes není zřejmě nutné.
Jak webovy server (TOMCAT) pozna, v jakem kodovani mu request prisel? (respektive v jakem kodovani jsou parametry POST/GET)
Je rozdil, v kodovani mezi metodami POST a GET?
u response je to jasny, tam se to nastavuje a prohlizec pak v stranku v danem kodovani zobrazi
jinak na tomcatu 5.5 (s jbossem) mi stacil pridat pouze ten filter
diky moc!
jinak u apachu pisou pro parametr: useBodyEncodingForURI
This specifies if the encoding specified in contentType should be used for URI query parameters, instead of using the URIEncoding. This setting is present for compatibility with Tomcat 4.1.x, where the encoding specified in the contentType, or explicitely set using Request.setCharacterEncoding method was also used for the parameters from the URL. The default value is false.
ale reauest zadny contentType nema ne? tak jak se muze podle content type urcit kodovani 🙂