我向浏览器发送消息,但浏览器只接收部分消息

时间:2014-08-31 13:03:08

标签: java utf-8

我用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 个答案:

答案 0 :(得分:1)

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

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


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