자바 컴파일시 인코딩 문제

Java 2016. 10. 14. 18:40

자바 컴파일시 인코딩(encoding) 에러

문제가 발생하는 코드

class Hello {
    public static void main(String[] args) {
    System.out.println("Hello, world."); // 화면에 글자를 출력한다.
    }
}

컴파일 오류

컴파일 시 error: unmappable character for encoding MS949 오류가 발생.

 $ javac Hello.java
Hello.java:3: error: unmappable character for encoding MS949
    System.out.println("Hello, world."); // ?  면에   ??    ? 출력?  ?  .
                                            ^
Hello.java:3: error: unmappable character for encoding MS949
    System.out.println("Hello, world."); // ?  면에   ??    ? 출력?  ?  .
                                                   ^
Hello.java:3: error: unmappable character for encoding MS949
    System.out.println("Hello, world."); // ?  면에   ??    ? 출력?  ?  .
                                                    ^
Hello.java:3: error: unmappable character for encoding MS949
    System.out.println("Hello, world."); // ?  면에   ??    ? 출력?  ?  .
                                                       ^
Hello.java:3: error: unmappable character for encoding MS949
    System.out.println("Hello, world."); // ?  면에   ??    ? 출력?  ?  .
                                                            ^
Hello.java:3: error: unmappable character for encoding MS949
    System.out.println("Hello, world."); // ?  면에   ??    ? 출력?  ?  .
                                                              ^
6 errors

설명

교재의 간단한 첫 예문부터 오류가 발생해서 당황하긴 했는데, 오류 메세지에 나와있는대로 문자 인코딩의 문제로 컴파일을 거부하고 있는 모습이다. 오류가 난 지점을 ^ 문자로 표시하는데 그 부분의 문자열이 인코딩 문제로 깨져보이는것을 알 수 있다.

컴퓨터에서 한글 문자는 역사적인 이유로 각각의 문자를 비트열로 부호화하는 방식(인코딩)이 몇가지가 되는데, 대표적으로 많이 쓰이는것들이 utf-8, euc-kr, cp949, ms949 정도 있다.호환성을 위해 어느곳이나 유니코드(utf-8 등)를 사용하는것이 좋다라고 생각해서 utf-8 인코딩으로 코드를 작성하였다.

위 문제는 utf-8로 인코딩된 코드를 자바 컴파일에서 한글 윈도우의 기본 인코딩을 따라서 ms949 방식으로 읽으려고 시도했지만 실패하여 발생한것이다. utf-8과 ms949와 같은 다른 한글 인코딩은 1바이트로 표시되는 영문자를 포함한 ascii 문자에서만 서로 호환성을 가질 뿐이라서 영문자들은 잘 표시되지만 한글은 알수 없는 엉뚱한 문자로 해석될 뿐이다

해결 방법

해결 방법은 소스파일과 컴파일러의 인코딩 방식을 서로 일치 시켜주는 것으로 해결 할 수 있는데, 대략 아래 3가지 방법으로 생각해볼수 있겠다.

  1. 편집기에서 파일 인코딩을 ms949로 저장 하도록 하는 방법
  2. 통합개발환경에서 컴파일 옵션으로 -encoding utf-8 을 설정하는 방법
  3. 자바 컴파일러에게 명시적으로 파일의 인코딩을 지정하는 방법(javac 파일명 -encoding utf-8)

개인적으로는 2~3번 방법을 사용하여 utf-8 인코딩만을 사용하는것을 권한다. 그 이유는 유니코드가 산업 표준으로 대부분의 환경에서 지원하여 다국어 환경에서 인코딩이 달라 서로 호환되지 않는 문제가 없기 때문이다.

$ javac Hello.java -encoding utf-8
$

2016-10-14 오후 6:27:10

'Java' 카테고리의 다른 글

자바 연산자 우선순위(Operator Precedence)  (0) 2016.10.18

설정

트랙백

댓글