2016-04-27 12 views
1

Ich habe einen einfachen HTTP-Server in Java geschrieben. Ich habe ein Problem mit der Rückgabe von Daten an den Browser.Nicht-englischer Buchstabe in BufferedWriter

schreiben Dieser eine zurück Inhalt:

this.writer = new BufferedWriter(new OutputStreamWriter(this.socket.getOutputStream(), Charset.forName("UTF-8").newEncoder())); 
... 
writer.write(this.getResponseLine() + "\n"); 
writer.write("Content-Type: " + this.contentType + "; charset=utf-8\n"); 
writer.write("Content-Length: " + this.body.length() + "\n"); 
writer.write("\r\n"); 
writer.write(new String(this.body.getBytes(), "UTF-8")); 
writer.flush(); 
writer.flush(); 

Methode this.body.getBytes() returns "Witaj świecie", aber in der Brower ist nur "Witaj Święci" (der letzte Buchstabe fehlt).

Wo ist das Problem?

+0

Es hängt wahrscheinlich mit der Länge von 'ś' zusammen. Ich vermute, wenn Sie zwei "¶" in der Zeichenfolge hatten, würden Sie stattdessen zwei Zeichen verpassen? –

Antwort

4

Meine Schätzung ist: this.body.length() ist die Zeichen zählen, nicht die Anzahl der Bytes. Mit einem UTF8-Zeichen darin ist der Header Content-Length um ein Byte zu klein, so dass der Browser das Lesen aus dem Socket beenden kann, bevor der HTTP-Nachrichtentext tatsächlich endet.

+0

Sie haben Recht !. Ich habe diese Zeile geändert in 'writer.write (" Content-Length: "+ this.body.getBytes(). Länge +" \ n ")' und es begann gut zu funktionieren – Simon

+0

@Simon: Ich denke Sie kann dies sogar billiger machen, indem der 'Content-Length'-Header ganz weggelassen wird. Clients, die [RFC 7230, Abschnitt 3.3.3] (https://tools.ietf.org/html/rfc7230#section-3.3.3) entsprechen, sollten das Ende einer Nachricht durch das Schließen der Verbindung durch den Peer bestimmen. – DaSourcerer

+1

@Simon, Sie sollten den Zeichensatz explizit angeben, wenn Sie die Länge berechnen, wie Sie es in allen anderen Anweisungen tun: 'writer.write (" Content-Length: "+ this.body.getBytes (" UTF-8 "). Length +" \ n ")'. – gudok