IT/컴퓨터와 한글

컴퓨터에서의 한글 처리 (5) 에디터별 차이점

smores 2013. 5. 5. 04:03

앞서의 공부를 통해서 이제는 조금 코드 인코딩 관련 역사와 상황을 조금 이해한 듯 하다. 이제는 내가 직면한 파이썬 프로그램과 관련한 한글 문제들이다.


우선 구글링을 해서 조금 알게 된 내용은 파이썬 3 대 부터는 기본적으로 내부 라이브러리의 인코딩 체계가 유니코드로 통일되었다 한다 (맞나?) 나는 아직도 2.7.3 을 사용하는 사용자... 


간혹 블로그등을 돌다 보면 맥 OSX 에서 파이썬 간단한 코드 작성하고 결과를 터미널에 보여주는 글들이 있는데 이건 뭐 특별히 인코딩 지시 없이도 한글 잘 나오는가보다. 그럼 나는?


똑같은 프로그램을 테스트하는데 이건 우분투에서 할때랑 윈도우즈에서 하는것 역시 달라 보인다. 게다가 사용하는 에디터 (주력으로 오랫동안 EditPlus 써 왔고 요즘 Geany 자주 쓰고 있다)가 달라지면 뭔가 조금 상황이 또 다르다???


한번 체계적으로 파 보자.


다음은 에디트플러스에서의 가능한 인코딩 체계이다. 그림에서 보는 바와 같이 Plain Text (노트패드의 ANSI와 같다), Unicode (리틀엔디언이라 짐작, 하지만 이건 나의 경우 쓸 일 없을 듯...), 그리고 UTF-8 이다. 나의 경우 디폴트로 Plain Text 이고 이 상태로 오랫동안 에디트플러스와 잘 살아왔다.




ANSI 상태에서 다음과 같이 EUC-KR 과 UTF-8 인코딩을 명시적으로 정의하고 간단한 코드를 작성해서 돌려본다. 




위의 그림에서와 같이 인코딩 지시에 관계없이 동일한 결과가 나온다. 게다가 문자 길이는 모두 4...


그렇다면 명시적인 인코딩이 없을 경우는?



음... 에러다.



그렇다면 코드를 저장할 때 ANSI 가 아닌 UTF-8 로 저장한다면???






허걱~ 다소 예상치 않은 결과다. 우선 UTF-8 의 경우는 결과는 나오는데 글자가 깨어지고 문자열 길이는 6 이란다. 인코딩을 EUC-KR 로 지시하면 아예 첫줄에서 에러가 난다. 아예 인코딩을 지시하지 않으면 UTF-8 인코딩 지시한 경우와 동일한 결과... 파일은 UTF-8로 저장해 놓고 막상 코드에서 강제적으로 EUC-KR 로 처리하라 하면 혼선이 생겨서 그런가?



동일한 실험을 Ubuntu 상에서 해 보았다. 사용한 에디터는 Geany...





인코딩을 UTF-8 로 명시하면 에러없이 터미널에서도 글자 잘 보이고 문자열 길이는 6 으로 나온다. 한편 인코딩을 EUC-KR 로 지시하면 윈도우즈에서와는 달리 첫번째 줄이 아니라 두번째 줄에서 에러가 나며 에러 내용도 조금 더 구체적으로 EUR-KR 이 주어진 문자열 디코딩하는 과정에서 에러난 것을 알려준다. 참고로 Geany에서 새로운 문서 작성할 때의 기본 인코딩은 디폴트로 UTF-8 로 설정되어 있고 나의 경우 이것을 바꾼 적이 없다. 인코딩 지시를 코드 내에서 하질 않으면 첫번째 줄에서 바로 에러가 난다. 에러 내용도 위의 것과 다르다. 그리고 자세히 보면 Non-ASCII character '\xed' 라고 첫번째 '한' 에 해당하는 문자에 대한 에러를 보여주는것 같은데 이에 대해서는 나중에 조금 더 언급하겠다.



그래서 다음으론 윈도우즈 상에서 Geany 를 이용해서 같은 코드를 만들어서 테스트 해 보았다.





코드내에서 EUC-KR 로 지시할 경우 우분투 Geany와 동일한 에러.

코드내에서 UTF-8로 명시할 경우 출력이 나오고 (다만 글자가 깨어진다) 길이는 6.

코드내에서 인코딩 명시하지 않은 경우는 역시 우분투 Geany 와 동일한 결과.



이제 조금 정리를 해 봐야 하겠다.




먼저 윈도우즈에서 ANSI 로 코드를 저장하게 되면 한글 코드는 EUC-KR 로 저장되는 듯 하다. 이때 명시적인 인코딩 지시가 없을 경우 윈도우즈 파이썬은 단순히 아스키 코드만을 처리하려 들면서 처음 만나는 '한' 자에서 아스키 코드 영역을 벗어나는 문자(C7)를 처리할 수 없어서 에러가 난다. 한편 윈도우즈의 터미널(커맨드모드 화면)은 기본적으로 CP949 에 해당하는 EUC-KR 인코딩이 기본이기에 EUC-KR 문자는 깨지지 않고 출력된다. 그렇다면 UTF-8 지시어의 경우는? 이 경우도 코딩하면서 이미 ANSI 모드에서 윈도우즈의 입력기가 EUC-KR 에 해당하는 코드 (C7) 로 넣어놓아서 출력 자체는 그대로 되는 것 같다. 나중에 파이썬 2.7 대의 print 문에 대한 내용을 조금 더 다뤄 보기로 한다.


한편 EditPlus 에서도 일단 UTF-8로 저장하도록 파일 인코딩 모드를 강제해 주면 코드 전체가 UTF-8 로 바뀌어 저장되는 모양이다. 즉, 화면에서 보이는 '한' 자가 이미 앞의 ANSI 모드의 '한' 자와는 다른 코드를 가지고 있는 것이다. (비록 보기에는 똑같아 보여도) 재미있는 점은 이 상태에서 인코딩 지시어 없어도 출력이 된다는 사실. 그리고 길이는 UTF-8 의 경우에 해당하는 6 바이트. 앞의 포스트에서 파일 저장하고 내용 체크한 것을 비교해 보라. UTF-8 의 경우 '한글' 이 ED 95 9C EA B8 80 의 6 바이트이다. 소스 파일의 헤더 3바이트는 빼고... 명시적 인코딩을 UTF-8 로 하면 동일한 결과. 헌데 소스 코드 안에서 EUC-KR 로 인코딩 할 것을 지시하면 encoding problem: utf-8 이라는 Geany 에디터에서는 볼 수 없는 에러가 나온다. 


에디터를 Geany로 쓰고 기본 저장 옵션인 UTF-8 로 파일을 저장하여 실행할 경우 우분투이던 윈도우던 동일한 결과들이 나온다. 다만 우분투에서는 터미널이 기본적으로 UTF-8 코드체계를 지원하기에 UTF-8 인코딩 지시한 경우 글자가 안깨어지고 잘 보이는 반면, 윈도우 커맨드모드 창에서는 EUC-KR 기반의 출력을 지원하기에 글자가 깨어져 보인다.


Geany의 경우 소스코드에 인코딩 지시어를 명시하지 않은 경우 마치 EditPlus에서 ANSI로 저장한 상황처럼 Non-Ascii ... 에러가 난다. 차이점은 저장된 소스코드에서 UTF-8로 저장되었을 것이기에 첫번째 바이트가 ED 라고 메시지가 보여준다. 이 부분이 EditPlus와 Geany의 차이... 


또 하나는 geany 에서 EUC-KR 로 코드내에서 인코딩을 지시할 경우 'euc-kr' codec can't decode bytes 라고 나온다. 이는 소스상의 '한글' 은 UTF-8 일 터인데 디코딩은 EUC-KR 로 처리하라 했으니 그럴 것이라고 이해하려 생각중이다. 다만 EditPlus 에서는 이 경우 encoding problem: utf-8 이라고 간단히 메시자가 나오는데 이는 윈도우 파이썬과 리눅스 파이썬의 메시지 차이인지 또 확인해 볼 필요가 있겠다. 


어떤 것이 올바른 처리인지는 나중에 다른 에디터도 테스트하거나 해서 조금 더 확인해 볼 필요가 있다. 다만 본인이 주로 즐겨 쓰는 두 에디터에서 상이한 결과가 나기에 그간 더 혼란이 많았었던 것 같다.