2016-03-22 6 views
0

Ich habe ein Java-Servlet, das einen Parameter String (inputString) übernimmt, der griechische Buchstaben von einer als utf-8 markierten Webseite enthalten kann. Bevor ich es auf eine Datenbank zu senden habe ich es an eine neue String (UTF8String) zu konvertieren, wie folgt:Warum muss ich einen utf-8-Parameter String zu iso-Latin codieren und dann als utf-8 dekodieren, um Java utf-8 String zu erhalten?

String utf8String = new String(inputString.getBytes("8859_1"), "UTF-8"); 

Dies funktioniert, aber, wie ich sei darauf hingewiesen, hoffen, hasse ich etwas verstehe ich nicht auch wenn es funktioniert.

Aus der Methodenbeschreibung in der Java-Dokumentation die getBytes() -Methode "Codiert diese Zeichenfolge in eine Sequenz von Bytes mit dem benannten Zeichensatz, Speichern des Ergebnisses in einem neuen Byte-Array", d. H. Ich es in 8859_1 - IsoLatin. Und aus der Konstruktorbeschreibung "Konstruiert einen neuen String durch Dekodieren des spezifizierten Arrays von Bytes unter Verwendung des spezifizierten Zeichensatzes", d. H. Decodiert das Byte-Array zu utf-8.

Kann mir jemand erklären, warum das nötig ist?

+0

Wenn Sie den Ajax-Anruf von Hand codieren, welche Zeichencodierung verwenden Sie für den Aufruf, dh für die POST-Methode, die Sie an die Server? Können Sie die HTTP-Anfrage erfassen und anzeigen? – Andreas

+0

Ich verwende eine GET-Anfrage und schaue auf meine js Ich sehe nicht die Zeichenkodierung der Anfrage angegeben. Ich verwende die JavaScript-Methode encodeURIComponent(), um die Zeichenfolge zu codieren. Ich kann die Anfrage nicht finden - verwende Mac Safari und muss in der Entwicklerkonsole an der falschen Stelle suchen. Ich frage mich nur, ob ich die Waffe gesprungen bin. Ich versuche, all die utf-8-Kodierung zu schreiben, die ich im Laufe der Jahre in etwa einem Dutzend Java-Apps verwendet habe. Ich hätte überprüfen sollen, dass diese Operation vor dem Posten wirklich notwendig war, also konnte ich mir sicher sein, wie man es bricht. Gib mir bitte Zeit dafür. – David

+0

OK, ich habe ein anderes einfacheres Servlet, das Javascript erstellt hat, um eine Zeichenkette von einer Web-Eingabe an das Servlet zu senden. Die HTTP-Anfrage enthält das griechische Zeichen, da es sich um eine Get-Anfrage handelt, die ich in meinem URL-Feld sehen kann: http: // localhost: 8080/MidgutAtlas/index.html? Search = gen & gen = & alpha; -Est4 & idtype = symbol.Aber ich glaube nicht, dass Sie den Zeichensatz bei einer HTTP-Anfrage nur für die Antwort angeben können. Und, ja, die Codezeile ist notwendig. – David

Antwort

0

Bei der Dekodierung konnten Sie keine Klasse mit einer Dekodiermethode erstellen, die die Bytes [] als Parameter verwendet und diese als Zeichenfolge zurückgibt? Hier ist ein Beispiel, das ich vorher benutzt habe.

public class Decoder 
{   
    public String decode(byte[] bytes) 
    { 
    //Turns the bytes array into a string 
    String decodedString = new String(bytes); 
    return decodedString; 
    } 
} 

Verwenden Sie dies anstelle von .getBytes(). hoffe, das funktioniert.

1

Meine Frage basiert auf einem Missverständnis bezüglich des für die HTTP-Anfrage verwendeten Zeichensatzes. Ich hatte angenommen, dass, weil ich die Webseite markiert habe, von der die Anfrage als UTF-8 gesendet wurde, die Anfrage als UTF-8 gesendet würde, und so würden die griechischen Zeichen in dem an das Servlet gesendeten Parameter als UTF-8 gelesen werden. 8 String ('inputString' in meiner Codezeile) durch die HttpRequest.getParameter() -Methode. Das ist nicht der Fall.

HTTP-Anforderungen werden als ISO-8859-1 (POST) oder ASCII (GET) gesendet, die im Allgemeinen identisch sind. Dies ist Teil der URI-Syntax-Spezifikation - Danke an Andreas, dass er mich auf verweist, wo dies erklärt wird.

Ich hatte auch vergessen, dass die Codierung von griechischen Buchstaben wie α für die Anfrage ist URL-Codierung, die% CE% B1 produziert. Der getParameter() behandelt dies, indem er ihn als zwei ISO-8859-1-Zeichen,% CE und% B1 - Î und ± (ich überprüfte dies) dekodierte.

Ich verstehe jetzt, warum dies in ein Byte-Array und die Bytes als UTF-8 interpretiert werden müssen. 0xCE stellt in UTF-8 kein Ein-Byte-Zeichen dar und wird daher mit dem nächsten Byte 0xB1 adressiert, um als α interpretiert zu werden. (Î ist 0xC3 0x8E und ± ist 0xC2 0xB1 in UTF-8.)