사건 발단
'본 글은 windows10 환경에서 Intellij를 사용하며 겪었던 한글 깨짐 문제의 회고입니다.'
Intellij를 사용하는데 openJDK 18 버전을 깔고나서 뭔 짓을 해도 콘솔에서 한글 출력이 (UTF-8 인코딩) 안 됐습니다.
찾아보니 18에 들어오면서 UTF-8 인코딩에 있어 살짝 변경이 있었습니다.
해결 방안
Open JDK 18 이전
Intellij의 상단 내비게이션 바의 File - Settings에 들어가서 File Encoding 메뉴의
Global Encoding, Project Encoding 그리고 Proprties Files를 UTF-8로 맞춥니다.
이후 Intellij 상단 내비게이션 바의 help 탭에서 Edit custom VM options부분을 클릭하여 다음 값을 추가합니다.
-Dfile.encoding=UTF-8
-Dconsole.encoding=UTF-8
이후 Intellij를 재시작합니다.
Open JDK 18
선호 방식 (JVM에 콘솔 인코딩 옵션을 추가합니다.)
Intellij 우측상단을 통해 dit Configurations에 들어갑니다.
Modify options를 선택한 다음, MV options을 선택합니다. 이후 다음 옵션을 추가합니다.
-Dfile.encoding="UTF-8" -Dsun.stderr.encoding="UTF-8" -Dsun.stdout.encoding="UTF-8"
이후 Java18이전에서 했듯이
Intellij의 상단 내비게이션 바의 File - Settings에 들어가서 File Encoding 메뉴의
Global Encoding, Project Encoding 그리고 Proprties Files를 UTF-8로 맞춥니다.
비선호 방식 (시스템 변수로 설정합니다. 느려짐의 원인이 될 수도 있어 비선호합니다.)
19이전의 방식에서 봤떤 Edit custom VM options에 다음 문장을 추가하시면 됩니다.
-Dfile.encoding=UTF-8
-Dsun.stdout.encoding=UTF-8
-Dsun.stderr.encoding=UTF-8
또 다른 방법으로는
환경 변수의 시스템 변수에서 JDK설치 시 설정해 둔 JAVA_TOOL_OPTIONS가 있을 것입니다.
없다면 생성하시면 됩니다. 이 때 이 값에
-Dfile.encoding="UTF-8" -Dsun.stdout.encoding="UTF-8" -Dsun.stderr.encoding="UTF-8"
다음 값을 추가하신 후 사용하시는 Intellij를 재시작하면 되겠습니다.
원인
JAVA18로 오면서 표준 Java API의 default charset이 UTF-8로 지정되었습니다.(https://openjdk.org/jeps/400)
UTF-8가 표준 Java API의 default가 되지만, console I/O는 제외됩니다.
Intellij의 console 설정을 UTF-8로 한 들, PrintStream(우리가 console에서 사용하는 스트림 ex. System.out)은
UTF-8로 설정되지 못한 것 입니다. (한글 Windows의 console 인코딩은 default로 cp949를 사용합니다.)
그리고 제가 위에서 설정한 세 값들이 표준 output의 charset인 것이다.
한 가지 걸리는 게 있다면 참고했던 글에서는 값을 입력한 세 요소가 지원을 받지 못하는 위치에 있는 요소이다 보니
이 방법을 사용해도 된다. 안 된다. 갈리는 입장이 나왔습니다.
현업에서 이러한 일이 발생되었다면 다른 분들에게 조언을 구해 이 방식을 적용해도 괜찮을 지 물어보는 것 도
좋아 보입니다.
다음 글들을 참고하였습니다.
https://bugs.openjdk.org/browse/JDK-4971166
읽어주셔서 감사합니다. 틀린 부분이나 부족한 부분이 있다면 말씀해주세요. 감사합니다.
'언어와 프레임워크 > Java' 카테고리의 다른 글
[Java] lazy evaluation(short circuit, loop fusion), Stream API (0) | 2023.07.26 |
---|---|
[Java] effectively final, lambda (0) | 2023.07.25 |
[JAVA] java 입장에서 call by value와 call by reference의 짧은 고찰. (0) | 2022.06.26 |
[JAVA] 클래스 메서드와 인스턴스 메서드 (0) | 2022.06.25 |
[JAVA] JVM의 메모리 구조 (0) | 2022.06.25 |
댓글