유니코드 관련 문답

몇 가지 질문들

여기까지 풀어놓은 이야기들은 이전에도 몇 번 한 적이 있고, 다른 곳에서도 들을 수 있는 이야기들이었는데…. 문제는 이런 글을 읽어도 늘 아리송하고 헷갈리는게 하나 둘이 아니라는 점이다. 그래서 FAQ 형식으로 몇 가지 질문을 살펴보도록 하자.

UTF8은 유니코드인가요

아니다. UTF8은 유니코드를 UTF8 이라는 방식으로 인코딩한 값이다. 한글 ‘가’는 "uac00"의 값인데, UTF8로 인코딩하면 "xeaxb0x80"으로 인코딩된다. 이는 각각 십진수로 변환했을 때 유니코드는 “44032”번째 글자에 해당하고, UTF8로 인코딩한 값은 (234, 176, 128)이 된다. 세 바이트를 하나로 묶어서 변환했다고해도 15,380,608이 되며, 유니코드 문자와는 별 상관없는 값이 된다.

텍스트파일을 압축한 zip 파일이 ㅇ텍스트파일이 아니듯이, UTF8로 인코딩한 유니코드 문자열은 더 이상 유니코드가 아니다. 다만 UTF8은 다시 그 압축을 풀었을 때 (디코딩했을 때) 온전한 유니코드로 변환될 수 있다는 점만 고려하면 된다.

EUC-KR은 유니코드인가요

물론 아니다. 유니코드는 유니코드일 뿐 다른 이름이 필요하지도 않고 있지도 않다. EUC-KR은 옛날옛날에 한국정부가 표준으로 제정한 “완성형한글”(KS X 1003)을 지칭하는 말이다. 완성형 한글은 여러 환경적인 제약 때문에 한글 2400여자와 인명 한자 몇 개, 궤선 및 기호 문자들을 포함하고 있는 코드페이지이며, 한국어 환경 외에는 쓰이지 않는다. 당연히 한국어(및 한국에서 쓰이는 문자)를 위한 코드페이지 이므로 EUC-KR을 사용해서는 여러 나라의 문자를 모두 표현하지 못한다.

인코딩으로서의 EUC-KR은 예전 완성형 한글에 포함되어 있는 글자에 대해서 유니코드로 변환 (혹은 그 반대로 변환)해주는 제한적인 인코딩을 말하며, “똠”이나 “샾”과 같이 완성형 한글에 포함되지 않는 글자에 대해서는 EUC-KR로 변환할 수 없다.

CP949는 모든 한글을 다 표현할 수 있다는데, 이건 유니코드의 일종인가요?

물론 이것도 아니다. “유니코드의 일종” 같은 건 (사실 있지만) 유니코드의 다른 이름으로서 유니코드를 대표할 수 있는 것은 없다. CP949는 마이크로소프트가 만든 확장완성형 한글로 완성형 한글 표준에 들어가지 못한 8000개 가량의 한글을 EUC-KR 뒤쪽에 덧붙여서 만든 (괴상한) 한글 코드 페이지이고, 현재는 해당 코드 페이지로 유니코드 중에서 한글 영역을 변환해주는 인코딩을 말한다.

그럼 이런 인코딩들은 모두 유니코드가 아닌가요?

그렇다. 인코딩은 유니코드를 지원하지 못하는 프로그램들에게 그 출신국가의 코드페이지를 지원하게 하기 위해서 사용하는 일종의 변환기이다. (변환기, 동영상 코덱같은 걸 떠올리면 된다.) 이렇게 변환된 글자 코드 데이터는 해당 코드페이지 용으로 변경되기 때문에 실제로는 유니코드가 아닌 해당 코드페이지의 데이터가 된다. 물론, 이런 인코딩들은 그 반대의 기능, 즉 해당 코드페이지의 값을 가지고 유니코드 값으로 변환하는 기능을 제공하고 있기도하다.

그럼 유니코드의 ‘일종’ 같은 건 없는 건가요?

엄밀히 말해서 ‘유니코드의 일종’같은 소리는 말도 안되는 소리이다. 대신에 유니코드에는 그 하위집합이 존재한다. UCS, UCS2, USC4, UCS5 같은 것들이 있다. UCS는 1바이트로 표현가능한 유니코드 페이지의 맨 앞쪽에 있는 문자세트이고, 이는 ASCII와 코드 값이 똑같다. UCS2는 USC1을 포함하며 2바이트까지 사용하는 유니코드의 일부분이다. 한국어도 이 영역에 들어가 있다. USC4는 4바이트 유니코드이며, 현재 유니코드라 하면 주로 이 영역까지를 일컫는다. 2013년을 기준으로 유니코드 6가 발표되었고, 5번째 바이트를 사용하는 영역이 배정되었다. (배정만 되었지 정의가 되었는지는 모르겠다.)

  • Jong Wook Kim

    1바이트 포맷과 UCS5는 처음 보는데 참고할 수 있는 레퍼런스가 있나요?

    UCS2는 이미 UTF-16으로 대체된 만큼 ‘UCS2가 유니코드고 UTF는 아니다’라기보단 ‘UTF는 유니코드 문자열을 바이트스트림으로 나타내기 위한 표준 형식이다’정도로 유니코드 캐릭터셋 자체의 추상적인 개념과 transport format의 개념을 분리해서 설명할 필요가 있습니다.

    지금 설명은 UTF-8이 CP949와 동등한 인코딩일 뿐이라고 오해할 소지가 있어 보입니다.