소켓 프로그래밍을 하던 중, 브라우저에 한글이 깨져 나왔다.
해결 방법
1. 응답 헤더에 인코딩 방식 정의
outToClient.writeBytes("Content-Type: text/html; charset=UTF-8\r\n");
2. HTML 파일에 인코딩 방식 정의
<meta charset="UTF-8">
3. IDE 기본 인코딩 방식을 UTF-8로 변경

4.프로젝트 SDK를 17버전으로 다운그레이드(18버전 이상부터 한글 깨짐 오류가 있다는 글을 확인함)

5. getBytes(StandardCharsets.UTF_8)로 명시적 정의
outToClient.write(outputdata.toString().getBytes(StandardCharsets.UTF_8));
5번까지 해서 한글이 깨지지 않고, 나왔다.
찾아보니 writeBytes를 하면 문자열을 시스템의 기본 인코딩 방식이 아닌 ISO-8859-1로 인코딩 후 바이트 배열로 변환하기 때문에 명시적으로 정의해야지 UTF-8로 인코딩된 것이다.
OpenJDK의 writeBytes 방식은 문자열의 각 문자를 1바이트로 변환하여 전송하는 것이다.
하지만 한글과 같은 유니코드 문자는 2바이트 이상을 필요로 하기 때문에, 이렇게 변환하면 문자가 깨지게 된다.
그래서 writeBytes를 했을 때, UTF-8로 다 설정을 해도 안 됐던 것이었따아아
'Java' 카테고리의 다른 글
| JVM 자동 메모리 관리 (1) | 2025.12.11 |
|---|---|
| 자바 예외 이해 (1) | 2024.10.06 |