삽질 포인트
IntelliJ IDEA에서 한글이 깨진다
IntelliJ IDEA 2024.1 버전에 한국어 언어 플러그인을 설치하여 새 프로젝트를 만들었는데, 기본으로 만들어주는 코드에
package kotlin.nbcamp.spartacodingclub;
//TIP 코드를 <b>실행</b>하려면 <shortcut actionId="Run"/>을(를) 누르거나
// 에디터 여백에 있는 <icon src="AllIcons.Actions.Execute"/> 아이콘을 클릭하세요.
public class Main {
public static void main(String[] args) {
//TIP 캐럿을 강조 표시된 텍스트에 놓고 <shortcut actionId="ShowIntentionActions"/>을(를) 누르면
// IntelliJ IDEA이(가) 수정을 제안하는 것을 확인할 수 있습니다.
// System.out.println(System.getenv());
System.out.println("안녕 그리고 반가운!");
for (int i = 1; i <= 5; i++) {
//TIP <shortcut actionId="Debug"/>을(를) 눌러 코드 디버그를 시작하세요. 1개의 <icon src="AllIcons.Debugger.Db_set_breakpoint"/> 중단점을 설정해 드렸습니다
// 언제든 <shortcut actionId="ToggleLineBreakpoint"/>을(를) 눌러 중단점을 더 추가할 수 있습니다.
System.out.println("i = " + i);
}
}
}-같이 한글 주석이 들어가 있었다. (중간의 한글 출력 코드는 본인이 넣은 것이다). 빌드를 실행했더니
error: unmappable character for encoding x-windows-949
-라며 그 한글 주석을 가리키는 것이다. 이것저것 삽질하다가 이 문제를 해결하고 빌드에 성공했더니 이젠 콘솔에서 한글이 깨져 나오는 상황이 생겼다.
JEP 400
… 근데 나중에 더 찾아보니 JEP 400: UTF-8 by Default라는 개선방안으로 인해 - JEP는 JDk Enhancement Proposal의 약자로 파이썬의 PEP(Python Enhancement Proposal)을 생각하면 된다 - JDK 18부터 Java API의 기본 문자 인코딩으로 UTF-8을 선택하며 이런 문제가 발생했다고 한다.
- 맥의 경우 기본 인코딩이
UTF-8으로 바뀐 게 (제안이 만들어진 2017년 기준으로) 좀 됐고, - 대다수의 리눅스 배포판들은
UTF-8을 기본 인코딩으로 설정했으며, - 서버 프로그램들은
-Dfile.encoding=UTF-8옵션을 대부분 기본으로 주고 시작하기에 이 JEP으로 인한 영향이 없을 건데, - 윈도우 같은 경우 사용자의 언어를 기반으로 하여 기본 인코딩이 달라진다(
windows-1252나windows-31j등).
그래서 여기선
- 아시아나 다른 특정 지역에서 돌아가는 서버 환경
- 아시아 지역의 Windows 사용자들
… 이렇게 두 종류에 해당하는 경우에 대해 이 JEP이 영향을 크게 줄 것이라고 했다. 이걸 보고 나서 시도한 건 2가지였는데,
JDK 17(혹은 그 이하 버전의JDK)를 사용한다.간단하다.JDK 18을 그대로 쓰되, 일부 구성파일들을 수정한다.
가 있었다. 2번을 통해 한 삽질들을 적어보면 다음과 같다:
파일 인코딩 변경
설정 > 에디터 > 파일 인코딩에서 다음 3개 항목에 대해 인코딩을 모두UTF-8로 변경해준다:
전역 인코딩프로젝트 인코딩프로퍼티 파일에 대한 디폴트 인코딩
- 같은 설정 항목 아래의
명확한 Native에서 ASCII로의 변환을 활성화한다.

- 화면 우측 하단의
파일 인코딩(아래에는x-windows-949로 설정된 항목이 그것이다)을UTF-8로 바꿔준다(바뀐 인코딩으로 파일을 저장하게 된다).

컴파일/실행 인코딩 변경
-
도움말 > 사용자 지정 VM 옵션 편집...항목을 누르면idea.vmoptions(IntelliJ IDEA가동에 쓰이는 JVM 옵션 구성 파일)의 아래에 다음 구성을 추가한다:-Dfile.encoding=UTF-8 -
실행 > 실행/디버그 구성항목으로 들어가,빌드 및 실행에서VM 옵션 추가를 통해 다음 옵션을 추가해준다():-Dsun.stdout.encoding=UTF-8 -Dsun.stderr.encoding=UTF-8각각
System.out스트림과System.err스트림의 인코딩을 설정해주는 옵션이다. (idea.vmoptions에선 설정해도 적용되지 않는다)
-
build.gradle아래에 다음 구성을 추가한다:tasks.withType(JavaCompile) { options.encoding = UTF-8 }Java로 컴파일하는 과정이 동반되는Gradletask(compileJava,compileTestJava등)들에 대해UTF-8인코딩 옵션을 추가하는 구성이다(로 이해했다). -
설정을 변경하고 나선 반드시
파일 > 캐시 무효화...로 아래 둘 항목을 선택한 후무효화 후 재시작을 눌러줘야 한다. 그렇지 않을 경우build.gradle이나idea.vmoptions에서 변경한 항목들이 적용되지 않는다.
그러고 빌드 후 재실행을 통해 한글이 (들어간 코드도 컴파일을 잘 해내고) 깨지지 않고 실행됨을 확인할 수 있었다.
