2014-08-31 22 views
0

我用Java编写了一个简单的服务器,但是我遇到了问题。负责发送响应浏览器的代码如下所示:我向浏览器发送消息,但浏览器只接收其中一部分

PrintWriter out = new PrintWriter(new OutputStreamWriter(this._client.getOutputStream(), StandardCharsets.UTF_8), true); 

out.write("HTTP/1.1 200 OK\n"); 
out.write("Access-Control-Allow-Origin: *\n"); 
out.write("Access-Control-Allow-Headers *\n"); 
out.write("Content-Type: application/xhtml+xml; charset=utf-8\n"); 
out.write("Accept-Encoding: UTF-8\n"); 
out.write("Content-Length: " + message.length() + "\n"); 
out.write("\n"); 
out.write(message); 
out.flush(); 

消息变量包含一个JSON字符串。当我想回到一个简单的字符串只包含ASCII字符它的确定 - 浏览器得到的一切:

{"data":[{"name":"{\"nick\":\"abc\",\"message\":\"czesc\"}","event":"message"}],"id":"cb822555313d73a697e5f908b1f21fff5eb85fedf062f301a4932d9547c1d266"} 

但当消息有波兰语字符,例如:

{"data":[{"name":"{\"nick\":\"abc\",\"message\":\"cześć\"}","event":"message"}],"id":"cb822555313d73a697e5f908b1f21fff5eb85fedf062f301a4932d9547c1d266"} 

浏览器只收到这样的:

{"data":[{"name":"{\"nick\":\"abc\",\"message\":\"cześć\"}","event":"message"}],"id":"cb822555313d73a697e5f908b1f21fff5eb85fedf062f301a4932d9547c1d266 

正如你看到的是相同的字符串,但没有最后两个字符。

为什么?

回答

1

请记住,“长度”必须包含Unicode转换所需的多个字符。你的UTF8字符不止一个字符。您将需要计算消息长度的实际的,而不仅仅是Java中始终为UTF16的字符串的长度。

ByteArrayOutputStream bytesOut = new ByteArrayOutputStream(); 
OutputStreamWriter out = new OutputStreamWriter(bytesOut, "UTF8"); 


out.write(yourString); 
out.flush(); 
byte[] tstBytes = bytesOut.toByteArray(); 
+0

好的,但我该怎么办呢? – Simon 2014-08-31 13:07:37

相关问题