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ď č. 1Pamä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();