다음과 같은 자바 코드가 있다고 가정을 해 봅시다.
public class LuvStar { public static void main(String[] args) { System.out.println("사랑별 (Luv Star):"); System.out.println(" 하나, 둘, 셋 다시 세어봐도 널 찾을 수 없어"); System.out.println(" 내 맘 속에 잠 들어 있는 너를 꺼내"); System.out.println(" 못다한 내 얘기들 모두 말 할거야 천천히 언제나 이대로"); System.out.println(" 나의 사랑 별 그리고 너"); } }
이 코드를 인코딩 모드를 UTF-8로 한 다음 LuvStar.java라는 파일로 저장하고 윈도우의 명령 프롬프트에서 컴파일을 시도하면,
LuvStar.java:3: error: unmappable character for encoding MS949 System.out.println("?궗?옉蹂? (Luv Star):"); ^ LuvStar.java:3: error: unmappable character for encoding MS949 System.out.println("?궗?옉蹂? (Luv Star):"); ^ LuvStar.java:3: error: unmappable character for encoding MS949 System.out.println("?궗?옉蹂? (Luv Star):"); ^ LuvStar.java:4: error: unmappable character for encoding MS949 System.out.println(" ?븯?굹, ?몮, ?뀑 ?떎?떆 ?꽭?뼱遊먮룄 ?꼸李얠쓣 ?닔 ?뾾?뼱"); ^
이와 같이 코드에 포함된 한글이 정체불명의 괴문자로 변하며 오류를 일으킵니다.
이 문제는 인코딩의 충돌로 인하여 발생하는 문제입니다. 윈도우 명령 프롬프트에서는 ASCII 기반의 코드페이지를 사용합니다. 즉, 한글 윈도우에서는 949 코드페이지를 사용합니다. 그렇기 때문에 한글 윈도우의 명령 프롬프트에서 javac 명령어로 컴파일을 하게 되면 기본적으로 CP949에 맞춰 컴파일이 이루어집니다. 그래서 UTF-8로 된 코드를 CP949로 읽어 컴파일을 하느라 문자열이 깨져서 오류를 일으키는 것입니다.
그렇다면, 명령 프롬프트에서 UTF-8 모드로 컴파일하는 방법은 없는 것일까요? 그렇지 않습니다. 소스가 유니코드로 되어 있을 경우 UTF-8로 읽어서 인코딩하는 옵션이 있어서 이 옵션을 이용하면 됩니다.
prompt> javac -encoding utf-8 LuvStar.java
이렇게 -encoding utf-8
옵션을 추가하여 컴파일하면 됩니다. 이 경우 소스코드가 UTF-8 인코딩으로 작성된 것으로 인식하고 그에 맞춰 컴파일하게 됩니다. 그러면 이번에는 오류 메시지 없이 바로 컴파일이 될 것입니다.
prompt> java LuvStar
이제 컴파일된 class 파일을 실행시켜 보면,
사랑별 (Luv Star): 하나, 둘, 셋 다시 세어봐도 널 찾을 수 없어 내 맘 속에 잠 들어 있는 너를 꺼내 못다한 내 얘기들 모두 말 할거야 천천히 언제나 이대로 나의 사랑 별 그리고 너
의도한 대로 실행이 됩니다.
이와 같은 방법으로 UTF-8로 된 자바 코드도 명령 프롬프트에서 컴파일할 수 있습니다.
ㅋㅋㅋ자바 검색하다가 사랑별 가사를 볼줄이야.. 감사합니다ㅋㅋㅋㅋ