본문 바로가기

프로그래밍/Java

[자바 JAVA] Server Socket 소켓 통신 한글 깨짐 해결 BufferedReader, InputStreamReader, PrintWriter, OutputStreamWriter.... JDK한글깨짐, 자바한글깨짐

728x90
반응형

보통 자바 소켓 통신에서 한글이 깨져서 출력될 때는 코드에 인코딩이 제대로 안되어 있으면 한글이 깨질 가능성이 높다고 한다. 그래서 서버와 클라이언트 모두 UTF-8 인코딩 설정을 해줘야하지만...

 

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String input = br.readLine();

// 클라이언트와 연결된 Socket 객체에서 OutputStream을 얻어옴
OutputStream out = clientSocket.getOutputStream();
// PrintWriter 객체를 사용하여 클라이언트로 메시지를 전송함
PrintWriter writer = new PrintWriter(new OutputStreamWriter(out, StandardCharsets.UTF_8));

writer.println(input);
writer.flush();

 

나같은 경우에는 자바 코드에서 이런식으로 서버에서든 클라이언트로든 메시지로 String 문자열을 전송했다

물론 처음에는 UTF-8 설정을 안해줘서 아 맞다 인코딩 설정 해줘야 하는데 하고 설정해줬지만

어림도 없지 한글 깨져버리기

 

 

결과는 영어, 숫자는 잘 보내지는데 한글로 보내면 한글이 깨진다는 것

보내는 쪽이든 받는 쪽이든 둘 다 깨진다

 

인터넷에는

 

PrintWriter writer = new PrintWriter(new OutputStreamWriter(out, "UTF8"));

 

이런식으로 UTF8, StandardCharsets.UTF_8 이런걸 쓰면 된다고 하지만 전혀 해결되지 않았다

 

그래서 나는 내 코드에 문제가 있다고 생각하지 않아서

IDE쪽에 의심을 해봤다

 

 

내가 사용하는 IDE는 인텔리제이라서 인텔리제이 한글 깨짐 문제를 검색했는데

설정의 파일 인코딩을 UTF-8로 변경해라는 글을 보고 따라했다

 

결과는 변동 없음

 

그러다가 구세주 같은 글을 보게되었는데

 

 

JDK 18 버전에 한글 깨짐 오류가 있다는 것

실제로 내가 사용하던 JDK 버전은 18 이었다...

이런 ㅅㅍ

 

 

바로 17로 변경해주자

변경 방법은

 

 

먼저 상단의 토글 버튼을 누르면 나오는 구성 편집을 들어가서

 

 

빌드 버전을 확인해보자

17 이하로만 하면 되니까 변경을 하고 실행을 하면 아마 코드를 읽을 수 없다고 나올 것이다

잘되면 상관없고 안되면 아래 방법을 그대로 하면될거

 

 

왼쪽 상단의 파일 버튼을 눌러서 프로젝트 구조로 들어가자

 

 

그러면 또 SDK 버전을 바꿀 수 있는데 이것도 바꿔주면 된다

그리고 대망의 실행.....

 

 

너무나 잘된다 ㅠㅠㅠㅠ

 

결국 문제는 IDE의 자바 버전 문제 였던것

 

어떤 사람은 바이트 배열로 전송을 하던데 그렇게 하기 싫어서 여러가지 찾다보니 이렇게 찾을 수 있었다....

원래 챗GPT에게 물어보려고 했는데 사람이 너무나 많이 접속하는지 지금 서버 터짐..

그래서 꽤 오래걸렸다 ㅠ....

 

 

 

728x90
반응형