/ / Posielam správu do prehliadača, ale prehliadač dostane iba jeho časť - java, utf-8

Posielam správu do prehliadača, ale prehliadač dostane iba časť z neho - java, utf-8

Napísal som jednoduchý server v prostredí Java, ale mám problém. Kód zodpovedný za odosielanie odpovedí do prehľadávačov vyzerá takto:

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

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

Na hlásenie premenná obsahuje reťazec JSON. Keď chcem vrátiť jednoduchý reťazec, ktorý obsahuje iba znaky ASCII, je to v poriadku - prehľadávač dostane všetko:

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

Ale keď hlásenie má poľské znaky, napríklad:

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

prehľadávač dostane iba toto:

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

Ako vidíte, ide o rovnaký reťazec, ale bez posledných dvoch znakov.

Prečo?

odpovede:

1 pre odpoveď č. 1

Pamätajte, že „dĺžka“ musí zahŕňať na prevod Unicode je potrebných viac znakov. Vaše znaky UTF8 zaberajú viac ako jeden znak. Budete musieť vypočítať reálny dĺžka správy, nielen dĺžka reťazca, ktorý je v Jave vždy UTF16.

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


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