[CS] 문자열 인코딩(character encoding)

    1. 시작하며

    회사에서 일하다가 급작스럽게 UTF-8 BOM 이슈를 맞닥뜨리게 되어 문자열 인코딩에 대해 공부하고자 한다.

    아래 내용은 학교에서 알려주지 않는 17가지 실무 개발 기술 1장을 내용을 요약한 것이다.

    2. 문자열 인코딩(character encoding)이란

    • 문자열 인코딩이란 컴퓨터가 문자를 이해할 수 있도록 일정한 규칙에 따라 2진수로 변환하는 방식이다.
      ex) 이 때의 규칙이란 ASCII, UTF-8, UTF-16, UTF-32 등이다.
    • 문자 집합(charset)이란 사용할 수 있는 문자들의 집합이다.
      ex) 유니코드, ISO-8859, ASCII

    엄격하게 구분하면 문자열 인코딩은 문자를 코드로 표한하는 방식이고 문자 집합은 사용할 수 있는 문자 집합이다. 그러나 흔히 문자 집합과 문자열 인코딩을 혼용해서 사용한다.

    2.1 왜 글자가 깨지거나 보이지 않는 이슈가 발생하는가?

    호환되지 않는 문자열 인코딩을 사용하여 문자를 읽었기 때문에 글자가 깨지는 이슈가 발생한다. 예를 들어 utf-8이나 euc-kr 같은 서로 다른 문자 인코딩 방식은 텍스트나 문자의 깨짐 현상을 일으키는 주요 원인중 하나이다.

     

    컴퓨터가 처음 등장했을 때 모든 프로그램이 영어와 일부 특수문자가 지원했다. 그러나 곧 여러 국가에서 독자적인 규칙을 만들기 시작했다. 이후 표준화 된 문자셋의 필요성이 커져 유니코드(UTF-8, UTF-16, UTF-32)가 등장하게 되었다.

    3. 아스키 코드 (ASCII)

    • 아스키 코드(American Standard Code for Information Interchange, ASCII)는 처음으로 표준을 정립한 문자열 인코딩 방식으로 아직까지 많이 사용된다.
    • 아스키코드는 영어만 표현 가능하다. 따라서 각 나라에서 컴퓨터를 사용하기 시작했을 때는 아스키 코드 대신 독자적인 문자 집합과 인코딩 방식을 만들어 사용하였다.

    4. EUC-KR

    • EUC-KR 은 한국 산업 표준(KS) 로 지정된 한국어 문자 집합이다.
    • 문자 하나를 표현하기 위해 2바이트를 사용한다.
    • 가능하다면 UTF-8로 바꾸는 것이 좋다.

    5. 유니코드(UTF-8, UTF-16, UTF-32)

    • 유니코드란 국가별로 독자적인 문자열 인코딩을 사용하는 문제를 해결하기 위해 국제표준화기구(ISO) 에서 동일한 규칙으로 모든 언어를 표현할 수 있도록 만든 문자 집합이다.
    • 유니코드 문자집합을 표현하는 문자열 인코딩은 총 3가지로 UTF-8, UTF-16, UTF-32가 있다.

    5.1 UTF-8

    • UTF-8은 8비트(1바이트)로 인코딩 한다는 것을 의미한다.
    • 가장 많이 사용되는 문자열 인코딩이다.
    • UTF-8은 아스키 코드와 완벽하게 호환된다.
    • 표현하려는 문자에 따라 최소 1바이트에서 최대 6바이트까지 사용한다. 그러나 대부분 4바이트 이내로 처리한다.
    • 윈도우, 자바, 임베디드를 제외한 거의 모든 환경에서의 문자열 처리 표준으로 봐도 좋다.
    • JSON은 UTF-8 인코딩만 사용하며 다른 문자열 인코딩은 표준에서 지원하지 않는다.
    • MYSQL의 UTF-8 타입에는 utf8과 utf8mb4가 있다. utf8은 3바이트까지 정상으로 처리하지만 4바이트 영역의 문자는 처리하지 못한다. 따라서 UTF-8과 완벽히 호환되기를 원한다면 utf8mb4를 써야한다.

    5.2 UTF-16

    • UTF-16은 16비트(2바이트)로 인코딩 하는 것을 의미한다.
    • UTF-16은 2바이트 또는 4바이트만을 사용하기 때문에 아스키코드와 호환되지 않는다.
    • 자바, 윈도우는 유니코드를 사용하기 전부터 고정된 2바이트 길이의 문자 집합을 사용했다. 그래서 UTF-16을 멀티 바이트라고도 한다. 두 환경에서 호환성 이외에 UTF-16을 사용할 별다른 이유는 없다.
    • UTF-16 기반 환경에서 UTF-8을 사용할 때는 사용 영역을 명확히 구분하는게 좋다. 예를 들어 자바 기반 웹 서비스는 기본적으로 UTF-16을 사용하되, 외부(데이터베이스와 브라우저 간) 통신 시 UTF-8로 변환하여 사용하는 것이 좋다.

    5.3 UTF-32

    • 4바이트를 고정적으로 사용한다.
    • 반드시 UTF-32를 사용해야 하는 환경이 아니라면 사용하지 않는다.

    6. 바이트 순서 표시 (BOM)

    바이트 순서 표시(Byte Order Mark, BOM)란 유니코드 문자 U+FEFF 로, 매직 넘버로서 문서의 가장 앞에 추가하여 텍스트를 읽는 프로그램에 여러 정보를 전달할 수 있다.

     

    자세한 내용은 BOM 문서를 확인하자

    7. 마치며

    문자열 인코딩은 실무에서 중요한 기술이다.

     

    문자열 인코딩이란 2진법을 사용하는 컴퓨터가 인간의 언어를 규칙에 따라 2진수로 변환하는 방식이다. 문자열 인코딩하는 방식에는 유니코드(UTF-8, UTF-16, UTF-32) 등이 있다.

    참고

    반응형

    댓글

    Designed by JB FACTORY