SoftEU

Tomcat a problémy s kódováním

Autor: Petr Ferschmann

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ů).

1 Hvězdička2 Hvězdičky3 Hvězdičky4 Hvězdičky5 Hvězdiček
Načítám ... Načítám ...

8 komentářů k článku “Tomcat a problémy s kódováním”

  1. Habi říká:

    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

  2. Jackie říká:

    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…. :)

  3. Petr Ferschmann říká:

    Ještě také někdy pomáhá použít ve formuláři:
    <form accept-charset=”utf-8″>

  4. Martin Kuba říká:

    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”.

  5. Petr Ferschmann říká:

    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.

  6. Petr Ferschmann říká:

    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é.

  7. kooudy říká:

    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!

  8. kooudy říká:

    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 :)

Zanechte komentář


Switch to our mobile site