[인코딩] 한글 인코딩 UTF-8 vs EUC-KR
한글 인코딩
파라미터를 던지는데 %eb%8b%a4%eb 이런 이상한 문자를 본 적이 있나요?
그렇다면 바로 인코딩 문제입니다.
한국에서 사용될 서비스를 개발하면 항상 글자 인코딩 설정 문제에 부딪히게 됩니다.
대부분의 프로그래밍 언어는 공용어인 영어를 기준으로 만들어졌기 때문에
한글이라는 특수한 문자를 사용하기 위해서는 한글을 표시할 수 있도록 한글을 위한 인코딩 설정을 해주어야 하죠.
인코딩
컴퓨터는 0과 1밖에 모르기 때문에 2진수 형태의 숫자로 나타내주어야 이해할 수 있습니다.
인코딩(encoding)
은 이렇게 숫자밖에 모르는 컴퓨터에게 사람이 사용하는 문자 또는 기호를 컴퓨터가 이해하도록 숫자로 바꾸어 주는 것을 말합니다.
가장 유명한 인코딩 방식은 1바이트(8비트)로 기호를 표현하는 ASCII코드
입니다. 예시를 살펴봅시다.
ASCII코드 표에 따르면
a → 96(0x61)
b → 97(0x62)
c → 98(0x63)
으로 변환됩니다.
즉, 사람이 컴퓨터에 abc를 입력한다면, 실제로 컴퓨터는 96 97 98로 이해한다는 것이죠.
반대 개념으로 디코딩(decoding)
이 존재하는데, 위의 예시를 보면
컴퓨터가 96 97 98을 뱉는다면 사람이 이해하도록 abc로 변환해주는 작업을 말합니다.
그렇다면 새롭게 시작하는 프로젝트에서 한글을 사용하기 위해 인코딩 설정을 해주어야 하는데,
어떤 인코딩을 사용해야할까요?
EUC-KR와 CP949
오래된 프로젝트의 소스코드를 까보면 대부분 EUC-KR
이라는 인코딩 방식이 적용되어 있습니다.
이런 프로젝트를 최근에 구성된 웹서버에서 사용하려고 하면 한글이 깨지는 경우가 많습니다.
최근에 구성된 서버는 UTF-8
을 사용하는 경우가 많아서 깨지는 경우가 대부분인데,
과거에는 왜 EUC-KR
을 썼을까요?
EUC-KR은 한글을 2바이트(16bit)로 표현하는 방식입니다. 아래의 표를 보시죠.
위와 같이 모든 글자 하나하나가 매핑되어 있습니다.
이러한 방식을 한글 완성형 인코딩
이라고 부릅니다.
EUC-KR은 2바이트이지만, ASCII와 호환성 등을 고려해 8,836개의 글자만 표현이 가능합니다.
하지만 한글의 모든 글자는 11,172자나 됩니다!
그러다보니 사용빈도가 높은 글자만 추려 2,350자만 선정해 EUC-KR에 탑재하게 되었습니다.
과거 인터넷 게시판 등에서 ㅎ+ㅡ+ㅣ+ㅆ = 힀 등을 입력하면 ㅁ과 같이 네모로 나왔던 것이 이 때문이죠.
하지만 당연하게도 2350자로만 사용하다보니 불편함이 많았고 이를 해결하기 위해 CP949가 나왔습니다.
CP949(코드페이지949)는 모든 한글을 표현하도록 만든 인코딩으로 EUC-KR을 완벽히 하위호환합니다.
참고로 CP949는 Microsoft에서 만들어 MS949로도 불립니다.
CP949로 완벽해진 EUC-KR이지만, 세 가지 문제가 있습니다.
- CP949에 포함되지 않은 문자는 표현할 수 없음
- 많은 운영체제, 서버, IDE의 인코딩 초기값이 UTF-8인 경우가 많음
- 고정형 길이(2바이트)
유니코드
유니코드(unicode)
는 다양한 문자를 숫자에 매핑할 때 모두 같은 매핑을 하도록 만든 표준입니다.
유니코드 협회가 제정하며, 한자를 제외하면 거의 모든 글자가 포함되어 있습니다.
포함된 글자를 보면 한중일영어는 물론이고, 룬문자, 캐나다 원주민 음절 문자, 고대 이탈리아 문자 등 본적도 없는 문자들도 이 유니코드에 포함되어 있습니다.
한자도 모든 글자는 아니지만, 한중일 통합 한자로 지정된 글자에 대해서는 포함되어있습니다.
UTF-8
은 이 유니코드를 표현하는 인코딩 방식입니다.
UTF-8
UTF-8
은 Universal coded character set + Transformation Format -8bit의 약자로
글자 하나에 1~4바이트를 점유하는 가변형 메모리 방식
입니다.
UTF-8은 코드포인트의 범위에 따라 차지하는 메모리가 다른데,
한글의 경우 U+AC00 ~ U+D7AF의 코드포인트를 갖는데, 이는 3바이트 인코딩 범위입니다.
ASCII의 글자들은 1바이트의 메모리를, 대부분의 라틴 알파벳은 2바이트 범위에 있습니다.
UTF-8은 4바이트까지 사용가능하여 EUC-KR보다는 훨씬 많은 글자를 표현 가능합니다.
그리하여 많은 운영체제와 시스템이 사용하게 되었고
이제는 유니코드를 표현할 때 대부분 UTF-8을 사용합니다.
특히 영어권의 경우 ASCII와의 호환성 덕에 1바이트로 표현 가능하니 다른 인코딩보다 효율적입니다.
하지만 한 글자에 3바이트씩 점유하는 한글같은 경우 EUC-KR의 2바이트에 비해 비효율적이죠.
이 문제 때문에 과거의 프로젝트에서는 EUC-KR을 많이 사용했습니다.
과거의 느린 인터넷 회선에서 최대한의 속도와 효율을 위해 EUC-KR을 사용했고,
그 때만 해도 다른 나라와의 호환성을 따지거나 다른 나라의 문자를 인터넷에서 보는 일이 흔치 않았죠.
이러한 장점으로 과거에는 EUC-KR을 많이 썼던 것 입니다.
그래서 어떤 인코딩을 쓸까?
기존에 사용하던 프로젝트가 EUC-KR, CP949이라면 EUC-KR, CP949를 쓰고
신규 프로젝트라면 확장성과 설정 용이성을 위해 UTF-8을 쓰세요!!!
단, 임베디드에서는 조금 더 고민해보세요..
정리
EUC-KR
- 영어와 한글만 사용하는 환경에서는 괜찮다.
- 심각하게 메모리 효율이 필요한 임베디드 시스템의 경우 UTF-8보다 좋다.
- 윈도우 환경에서는 편의를 많이 봐주지만, 다른 운영체제에서는 글쎄..
UTF-8
- 다양한 국가를 대상으로 하려면 유니코드 표현을 위한 UTF-8이 필수!
- 많은 장비, 서버, 소프트웨어가 이미 쓰고있으니, 필요없는 충돌을 피하려면 UTF-8이 편하다.
여담
기존의 프로젝트의 인코딩을 바꾸는 것은 굉장히 귀찮습니다.
저도 EUC-KR로 되어있던 안드로이드 프로젝트를 UTF-8로 이관하다 설정파일만 제대로 설정하고,
소스코드는 그때그때 오류가 떠야 수정했던 기억이 있습니다…
처음부터 UTF-8을 씁시다!
댓글남기기