我用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
如你所见,它是相同的字符串,但没有最后两个字符。
为什么?
答案 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();