글
자바 컴파일시 인코딩 문제
자바 컴파일시 인코딩(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가지 방법으로 생각해볼수 있겠다.
- 편집기에서 파일 인코딩을 ms949로 저장 하도록 하는 방법
- 통합개발환경에서 컴파일 옵션으로 -encoding utf-8 을 설정하는 방법
- 자바 컴파일러에게 명시적으로 파일의 인코딩을 지정하는 방법(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 |
---|