Kaputte Umlaute in Servlet (Tomcat/Linux)

SOLOWK1

Grünschnabel
Hi zusammen,

ich habe ein Umlautproblem in einer Webapplikation welche auf Tomcat 5.5 laufen.
Auf meiner Lokalen Installation werden Umlaute korrekt aungezeigt und in die Datenbank gespeichert, auf der Serverinstallation werden sie nur als ? gespeichert.

Beide Webanwendungen verbinden sich auf die selbe Datenbank:
- Mysql, varchar-Spalten verwenden utf8.
- Verwendeter Connectionstring: jdbc:mysql://servername/foo_test?characterEncoding=utf-8&useUnicode=true&jdbcCompliantTruncation=false

Folgender http-Request kommt rein:
http://servername:8080/servlet/Import?Etwas%20wurde%20am%2025.08.2010%2010%3A16%3A50%20ge%E4ndert

Der Querystring wird im Servlet mit Hilfe von org.apache.commons.codec.net.URLCodec.URLCodec dekodiert:

Code:
String unparsedParameters = request.getQueryString();
URLCodec codec = new URLCodec("ISO-8859-1");
result = codec.decode(unparsedParameters);

Das Wort "geändert" wird im dekodierten String auf der lokalen Installation (Windows) korrektangezeigt und in die Datenbank übertragen. Bei der Linux-Installation heißt es "ge?ndert".

Kann mir jemand weiterhelfen?

Danke.
 
Fehler behoben.

Anstatt

Code:
codec.decode(unparsedParameters);

mache ich das nun so:

Code:
fURLDecodigCharset = "ISO8859-1";
...
byte[] bytes = originalParam.getBytes(fURLDecodigCharset);
byte[] decodeUrl = URLCodec.decodeUrl(bytes);
result = new String (decodeUrl, fURLDecodigCharset);

Der Grund liegt wohl daran, dass bei der Umwandlung des Bytearrays zu einem String mit der alten Variante das defaultcharset verwendet wird, und das möglicherweise irgendwas ist, nur nicht iso-8859-1.

Siehe java.lang.StringCoding.decode(byte[], int, int)
dort wird der Defaultcharset benutzt.

String csn = Charset.defaultCharset().name();

The default charset is determined during virtual-machine startup and typically depends upon the locale and charset of the underlying operating system.

Das erklärt auch, dass es sich unter Windows und Linux unterschiedliche verhält.

Danke.
 
Bin gerade darauf hingewiesen worden, dass es auch noch einfacher geht.

Code:
import org.apache.commons.codec.net.URLCodec;
...
...

URLCodec urlCodec= new URLCodec(fURLDecodigCharset);
urlCodec.decode(originalParam, fURLDecodigCharset);
 
Zuletzt bearbeitet:
Zurück