Friday, May 16, 2008

Parametry wysyłane GETem, polskie znaki i UTF-8

Ostatnio miałem problem w pracy z ukochanymi polskimi znakami, a konkretniej z wysyłaniem ich metodą GET. W projekcie kodowanie to UTF-8 przy przekazywaniu parametrów z polskim kodowaniem (zakodowanych oczywiscie do UTF-8)  w request-cie przychodziły krzaki.

Problemem okazało się, że przesyłanie znaków zakodowanych GETem niewiele daje bo serwer aplikacyjny ma w swojej konfiguracji zapiane w jakim kodowaniu są requesty i tak je przetwarza, zwykle jest to Latin-1.

Co należy zrobić ?
W przypadku JBoss'a:

W pliku %jboss-home%\server\%konfiguracja%\deploy\jboss-web.deployer\server.xml należy dodać atrybut URIEncoding="UTF-8" elementu Connector (dla portu 8080)

W przypadku gdy ruch do JBossa jest kierowany przez Apacha za pomocą mod_jk konieczne jest dodanie w server.xml do Connectora atrybutu URIEncoding="UTF-8" (tym razem dla portu 8009). I powinno śmigać

A tu troche literatury na temat kodowania polskich znaków:
http://java.sun.com/developer/technicalArticles/Intl/HTTPCharset/

http://www.warski.org/blog/?p=4

http://confluence.atlassian.com/display/DOC/Configuring+Tomcat's+URI+encoding

A z takich ciekawostek to kiedyś miałem też problem z PostgreSQL 8.1 (ale w innych wersjach było to samo) ponieważ baza była zainstalowana z innym niż UTF-8 domyślnym kodowaniem.
Problem był z polskimi znakami w bazie mającej kodowanie ustawione na UTF-8. Wyszystko było w porządku do momentu kiedy wywołało się w SQL funkcji tolower , toupper. Polskie znaki nie były traktowane wtedy jako litery tylko jako znaki specjalne i tym samym nie były "zmniejszane" i "zwiększane". Zainstalowanie bazy z domyślnym kodowaniem UTF-8 pomogło.