ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 개발자라면 알아야할 인코딩 이야기
    2013. 12. 12. 1 comments

    character set, encoding

    컴퓨터 세상에서는 문자를 표현하기 위해서 문자집합을 정의해야 한다. 표현해야할 문자(a,b,c,...)와 특수문자를 정의하고 순서를 지정한 것을 문자 집합(character set)이라고 한다. 이러한 문자집합을 행렬의 코드형태로 표기한 것을 "코드화된 문자집합(coded character set) 이라 한다. 예를 들어 '가'를 10001 이렇게 2진수를 통하여 표기하는 방식이다.

    문자집합을 컴퓨터에 저장하기 위하여 Byte형태로 표현한 것을 인코딩 방식(CES, character encoding scheme)라 불려지고 있다.

    대표적으로 ASCII(American Standard Code for Information Interchange)를 이야기 할 수 있는데요. 0x00 ~ 0x7F 총127개 문자와 특수문자를 정의하고 영어만 가능하기 때문에 유럽어는 불가능한 타입인데 이 후 확장 ASCII(extended ASCII)의 등장으로  0x80 ~ 0xFF 127개를 추가로 정의하여 프랑스어, 독일어등 유럽어 표현 가능하게 되었다.

    하지만 문제점은 여전히 한국,중국,일본등에서는 ASCII 코드로 처리가 불가능한 것인게 문제이다.

    unicode

    모든 언어들은 ASCII 이후, 독자적인 문자집합을 만들어서 표현하고 있는데 앞에서 말했던 것과 같이 어떻게 동시에 한국,중국,일본어를 표현하느냐의 문제가 발생한다. 특히 웹에서 각자 독자적인 문자 집합을 사용했기 때문에 문자 집합을 지원하지 않으면 글자를 볼 수 없는 상황이 종종 발생하게 된 것이다. 이 문제를 극복하기 위해 전 세계적으로 사용되는 모든 문자 집합을 하나로 모아 탄생시킨 것이 유니코드(unicode) 이다. 즉, 유니코드의 목적은 현존하는 문자 인코딩 방법들을 모두 유니코드로 교체하려는 것이다.

    유니코드의 값은, 코드 포인트(code point)를 사용하는데 보통 U+를 붙여 표시한다.

    • 'A'의 유니코드 값은 U+0041로 표현(\u0041로도 표기).
    • 유니코드는 공식적으로 31비트 문자 집합이지만 현재까지는 21비트 이내로 모두 표현
      (즉 문자 하나당 4byte의 크기를 필요)
    • 대부분의 문자는 U+0000~U+FFFF 범위에 있는 기본 다국어 평면에 속함.

    유니코드의 종류는 UCS-2와 UCS-4, 변환 인코딩 형식(UTF, UCS Transformation Format)인 UTF-7, UTF-8, UTF-16, UTF-32과 같이 다양하게 존재하지만   ASCII와 호환이 가능하면서 유니코드를 표현할 수 있는 UTF-8 인코딩이 가장 많이 사용한다.

    • EUC-KR, KS X1001과 KS X 1003 표준안의 인코딩 방식.
    • CP949(영문 MS Window 기본인코딩)
    • MS949(한글 MS 기본인코딩)
    • x-windows-949는 확장 완성형 인코딩 방식.
    • ko, ko_KR, ko_KR.eucKR은 모두 EUC-KR 인코딩이며, ko_KR.UTF-8만 UTF-8 인코딩

     

    unicode와 프로그래밍

     ISO C 멀티-바이트 변환 함수들(wprintf(), mbstowcs() 등)은 glibc 2.2 혹은 그 이상에서 완벽하게 구현되며, UTF-8 과정을 포함하면서 wchar_t와 로케일 독립적인 멀티바이트 인코딩 사 이에서 변환하기 위해서 사용할 수 있다. 

    wprintf(L"Schone Grüße!\n");

    소프트웨어는 이러한 텍스트를 사용자가 환경 변수 LC_CTYPE으로 선택한 로케일에 명시된 인코딩상에 출력한다.

    컴파일러는 C 소스 파일에서 사용하는 인코딩에 적합한 로케일에서 동작해야만 하기 때문에 위의 문자열은 유니코드 wchar_t 문자열에 의해서 오브젝트 파일에 정확하게 저장될 것이고 출력시에는 런-타임 라이브러리가 wchar_t 문자열을 프로그램이 실행되는 환경의 로케일에 꼭 맞는 인코딩으로 다시 변환시킬 것이다.

    리눅스에서는 LANG 환경 변수에 따라 다르지만, ko, ko_KR, ko_KR.eucKR은 모두 EUC-KR 인코딩이며, ko_KR.UTF-8만 UTF-8 인코딩으로 취급한다.  CentOS의 경우 /etc/sysconfig/i18n에서 시스템 기본 인코딩을 설정할 수 있다.

    linux system encoding

    $ locale  
    
    LANG=ko_KR.UTF-8
    LC_CTYPE="ko_KR.UTF-8"
    LC_NUMERIC="ko_KR.UTF-8"
    LC_TIME=ko_KR.UTF-8
    LC_COLLATE="ko_KR.UTF-8"
    LC_MONETARY="ko_KR.UTF-8"
    LC_MESSAGES=C
    LC_PAPER="ko_KR.UTF-8"
    LC_NAME="ko_KR.UTF-8"
    LC_ADDRESS="ko_KR.UTF-8"
    LC_TELEPHONE="ko_KR.UTF-8"
    LC_MEASUREMENT="ko_KR.UTF-8"
    LC_IDENTIFICATION="ko_KR.UTF-8"
    LC_ALL=

    위의 환경변수의 값을 export 명령어를 통해서 변경함으로써 시스템의 인코딩을 변경할 수 있다.  

    iconv 프로그램을 통해서 파일 또한 다른 인코딩으로 변경이 가능하다.

    iconv -f "euc-kr" -t "utf-8" FILE

    또한 vi 에디터에 대해서도 "set enconding", "set fileencoding" 명령으로 인코딩 설정을 할 수 있다. 윈도우의 putty와 같은 터미널도 출력 enconding 타입이 설정 가능하고 터미널 연결 후 파일을 열었을 때 putty의 출력될 enconding 타입이 맞지 않는 경우에는 글자가 제대로 나타나지 않을 수도 있기 때문에 터미널과 파일, 그리고 시스템의 인코딩 타입의 확인이 필요하다. 

    See also

    • encoding
      • http://helloworld.naver.com/helloworld/19187
    • unicode
      • http://ko.wikipedia.org/wiki/%EC%9C%A0%EB%8B%88%EC%BD%94%EB%93%9C
      • http://wiki.kldp.org/Translations/html/UTF8-Unicode-KLDP/UTF8-Unicode-KLDP.htm
    • locale
      • http://www.joinc.co.kr/modules/moniwiki/wiki.php/Site/Linux/Locale

     

    반응형

    댓글 1

Designed by Tistory.