2016-04-27 14 views
1

私はJavaで簡単なHTTPサーバーを作成しました。私はブラウザにデータを返すことに問題があります。BufferedWriterの非英語の文字

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(); 

方法this.body.getBytes()を返す "Witajのświecieを" が、ブラウワーに "Witajświeci"(最後の文字が欠け)のみです:

これは、返されたコンテンツを記述します。

問題はどこですか?

+0

おそらく '¶'の長さに関係しています。文字列に2つの '¶'があるとすれば、代わりに2つの文字が欠けていると思いますか? –

答えて

4

私の推測は:this.body.length()文字で、バイト数ではありません。 1つのUTF8文字があると、Content-Lengthヘッダーが1バイト小さくなりすぎて、HTTPメッセージ本文が実際に終了する前にブラウザがソケットからの読み取りを停止します。

+0

あなたはそうです!私はこの行を 'writer.write(" Content-Length: "+ this.body.getBytes()。length +" \ n ")' に変更して、うまく動作するようになりました。 – Simon

+0

@シモン: 'Content-Length'ヘッダを省略することでこれをさらに安くすることができます。 [RFC 7230、section 3.3.3](https://tools.ietf.org/html/rfc7230#section-3.3.3)に従うクライアントは、ピアを通じた接続の終了によってメッセージの終わりを判断する必要があります。 – DaSourcerer

+1

@Simonでは、他のすべての文と同様に、長さを計算するときに文字セットを明示的に指定する必要があります: 'writer.write(" Content-Length: "+ this.body.getBytes(" UTF-8 ")。 \ n ")'。 – gudok

関連する問題