Programming/Java
JAVA :: Windows 운영체제에서 컴파일(compile)할 때 문자열 깨지는 이유
WANJIN
2017. 5. 1. 12:41
반응형
컴파일(Compile)
자바 소스코드(source code)를 기계가 이해하기 쉬운 바이트코드(byte code)로 변환하는 것을 컴파일이라고 한다.
이런 일을 해주는 놈을 우리는 컴파일러(compiler)라고 부름.
컴파일할 때에는 단순히 바이트코드로 변환만 하는 것이 아니라, 소스코드의 문법을 분석하고, 문법이 유효한지 유효성 검사가 이뤄진다.
문제가 없으면 byte code로 이뤄진 .class 파일이 생성되는데, 문자들이 어떤 방식으로 인코딩이 되냐하면
컴파일할때 사용하는 그 OS의 기본 문자열집합으로 인코딩이 된다.
윈도 운영체제 사용하는 사람들 중에, 소스코드에 한글이 포함된 파일을 컴파일 돌렸을 때 컴파일 에러를 만나본 적이 있을 것이다.
왜 컴파일할 때 문자가 깨지고 에러가 날까?
그것은 Windows 운영체제가 기본적으로 컴파일할 때 문자열들을 MS-949 문자열 집합(character set)으로 인코딩하기 때문이다.
Mac OS는 기본이 UTF-8인데, Windows 운영체제는 자기네들이 만든 MS-949 캐릭터 셋으로 기본 설정이 되어 있어서,
소스코드에 작성한 문자들을 byte code로 변환할 때 모조리 MS-949로 인코딩해버린다.
따라서 지금 내가 컴파일을 돌리고 있는 컴퓨터 운영체제가 윈도우 운영체제다, 라고 하는 사람들은
컴파일할 때 국제표준인 UTF-8로 인코딩한다고 지정해주는 것이 바람직하겠다.
* Eclipse와 같은 개발 툴을 이용한다면 설정만 해주면 자동으로 해준다. 그러나 명령창에서 컴파일 돌리는 경우에는 자동으로 안해주니까 신경쓸 것.
컴파일하는 방법 => javac 파일명.java 컴파일할 때 문자열집합(캐릭터) 인코딩 하는 방법 => javac -encoding 문자집합 소스파일명 Ex) javac -encoding utf8 파일명.java |
대체 MS-949는 뭐고, UTF-8은 뭔가?
하고 궁금할 것이다.
'가', '나', '다', ... 이런 문자들은 사실 하나의 '그림'이다.
컴퓨터는 0과 1만 읽어들일 수 있는, 사실은 아주 멍청한 놈이라 '[1010 1100 0000 0000] 이런 비트 조합으로 입력이 들어오면 '가' 라는 문자를 뿌리겠다' 라는게 미리 정의되어있지 않으면 우리한테 문자들을 보여줄 수 없다.
즉, 컴퓨터에 일일이 가, 각, 곽, 꽋 등 표현할 수 있는 모든 문자 그림이 비트조합으로 저장이 되어있다 이 말이다.
문제는 MS949와 UTF8은 서로 정의된 비트조합이 다르기 때문에 문자가 깨지는 일이 발생한다는 거다.
MS949로 입력한걸 UTF8로 보려고 하면, 해당 비트조합에는 전혀 다른 문자가 정의되어 있기 때문에, 우리가 보기에는 문자열이 꼭 깨진 것 처럼 보이는 것이다.
이 때문에 어떤 문자열집합으로 인코딩했는지가 중요하다.
왜 영어는 안깨지냐구?
영어는 MS949나 UTF8이나 똑같은 비트조합을 사용하고 있기 때문이다.
한글은 다른거고.
그니까 앞으로 한글이 소스코드에 포함되어 있는데 하필이면 윈도 운영체제에서 작업을 하고 있다, 라고 한다면 문자열 인코딩을 한번쯤은 확인하길 바란다.
끄읏.
반응형