2014-08-31 5 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\":\"cześć\"}","event":"message"}],"id":"cb822555313d73a697e5f908b1f21fff5eb85fedf062f301a4932d9547c1d266"} 

브라우저에만 나타납니다

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

그러나 메시지 예를 들어 폴란드어 문자를 가질 때 이 :

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

같은 문자열이지만 마지막 두 문자는 없습니다.

왜?

답변

1

"길이"는 유니 코드 변환에 필요한 복수 문자 을 포함해야합니다. UTF8 문자는 한 문자 이상을 차지합니다. Java에서 항상 UTF16 인 문자열의 길이가 아니라 실제 메시지 길이를 계산해야합니다.

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


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

그래, 어떻게 할 수 있습니까? – Simon

관련 문제