[인코딩] 한글 인코딩 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표

위와 같이 모든 글자 하나하나가 매핑되어 있습니다.
이러한 방식을 한글 완성형 인코딩이라고 부릅니다.
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을 씁시다!


참고페이지

카테고리:

업데이트:

댓글남기기