Kodierungsproblem bei Parameterübergabe von Browser an Servlet (GET)

atoc

Grünschnabel
Hallo allerseits,

bin neu hier und ich hoffe ich bin an der richtigen Stelle gelandet. Wenn nicht, bitte um Nachsicht und Verschieben:)
Ich arbeite gerade an meinem Abschlußprojekt für meine Ausbildung und habe ein Problem, wäre bombe wenn jemand nen Lösungsansatz oder ne Idee hätte.

Also im Groben bau ich ne Schnittstelle zwischen ner MySQL-Datenbank und nem Servlet. Die Datenbank ist via EJB3 auf verschiedene Objekte abgebildet und die Kommunikation zwischen Geschätslogik (SQL-Abfragen) und Servlet findet über ein Remote-Interface statt.
Das Servlet übernimmt die Parameter des GET-Requests aus der übergebenen Request-Variable und leitet sie entsprechend weiter.

Das funktioniert auch alles soweit, nur habe ich Probleme mit der Zeichenkodierung innerhalb der Request-Parameter.

In dem Servlet werden auch Links erzeugt, die wiederum einen neuen Request darstellen, dort enkodiere ich die Parameter mittels

Code:
java.net.URLEncoder.encode(String string, "UTF-8");

Dieser String wird auch korrekt auf der HTML-Seite ausgegeben (Bsp: %C3%B6 -> ö)

Nun dachte ich beim Servlet einfach

Code:
java.net.URLDecoder.decode(String string, String "UTF-8");

verwenden zu können um die Parameter wieder zu dekodieren, das klappte aber nicht, es kamen nur Strings in der Form "ö" (ö-> Ausgabe der Konsole) an, mit der diese Methode logischerweise nichts anfangen kann.

Habe dann im Internet eine Möglichkeit gefunden, es klappte dann mittels

Code:
value = new String(value.getBytes("ISO-8859-1"));

Nun mein aktuelles Problem: Habe hier auf Arbeit eine Entwicklungszone mit Solaris als Betriebssystem. Dort ist die gleiche Jboss-Version installiert und auch die gleiche Version meines Projekts deployed wie auf meinem lokalen Rechner. Dort klappt das alles wieder gar nicht, es kommt für jegliche Sonderzeichen nur der String "" an. Habe schon sämtliches versucht und finde auch im Netz irgendwie nichts was mir weiterhelfen könnte. Hat jemand von euch da eine Idee? Das Problem ist nämlich, dass das Projekt wenn es fertig ist auf genau so einer Zone laufen soll, also müsst ich das irgendwie hinbekommen.

Wenn ich in der server.xml meines Servers beim Connector-Tag 'URIEncoding="UTF-8"' hinzufüge, brauch ich den Parameter bei mir lokal gar nicht mehr dekodieren und auf der Zone kommt nur noch ein ? an.

Was vielleicht auch noch hilfreich ist, verwende die Bibliothek Apache Commons Lang (org.apache.commons.lang.StringEscapeUtils.escapeHtml()) zum escapen der Strings, und diese liefert mir trotz des ? im übergebenen String das richtige Zeichen zurück (Bsp: ü ) Also muss in dem String ja irgendwie das richtige Zeichen versteckt sein.
unescapeHtml(escapeHtml(string)) klappt leider nicht, liefert wieder das Fragezeichen.

Sehr merkwürdig das alles, naja würde mich wie gesagt freuen wenn jemand ne Idee hat :)

beste Grüße
 
Hi,

Du könntest mal gucken in bezug auf die für GET Requests verwendeten Clients: da kann schnell mal aus einem URL enkodierten Zeichen ein 2-fach enkodiertes Zeichen werden, da der Browser Dir das
"abnimmt" und das bereits enkodierte zeichen nochmals enkodiert.

Die zwei Standards UTF-8 und ISO-... sind Charactersets -> generell muss man so dekodieren, wie zuvor enkodiert wurde (UTF-8 zu UTF-8 etc.).

Wenn innerhalb der Servlets URLEnkodierte Parameter erzeugt werden, welche dann über eine JSP ausgeliefert werden sollen muss die JSP das Encoding anführen
Code:
<%@page contentType="text/html" pageEncoding="UTF-8" %>

Die meisten Fehler in Richtung Charset basieren auf falsch bzw. gar nicht angegebener Enkodierung.
Dann wird beim Senden/Empfangen stets z.B. die Browser Einstellung als Default genommen - wenn die auf ISO steht nützt Dir das UTF-8 En- bzw. dekodieren nichts.

Viele Grüße, Tim
 
Hey,

Vielen Dank für die antwort!
Habe das Problem inzwischen mit dem Eintrag

Code:
useBodyEncodingForURI="true"


in der server.xml und mit ner JSP gelöst. Das Problem mit den Umlauten auf der Solaris-Zone (Terminal) war eigentlich gar keins, kam anscheinend nur durch die SSH-Verbindung nich richtig an.. Blöd und verwirrend sowas :D

Viele Grüße
 

Neue Beiträge

Zurück