ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 문자열 인코딩 (unicode/UTF8, UTF16, ASCII)
    공부 2016. 11. 9. 14:02

    Unicode

    유니코드. 인코딩이라기보다는 개념. 문자열을 숫자로 표현하기 위하여, 문자 하나와 숫자 하나를 각각 매핑한 것이 바로 유니코드. 매핑은 한글로 하면 사상인데, 쉽게 연결이라고 생각하면 됩니다.

    예를 들어 A는 U+0041에 매핑되어 있고, '가'는 U+AC00에 매핑되어 있습니다. 그리고, 이 유니코드를 저장하는 방법에는 UTF-8, UTF-16 등등 여러 방법이 존재합니다. 

    UTF-8

    컴퓨터를 다루면서 자주 보았을 UTF-8은 유니코드 인코딩 중에 하나로, 문자열을 8-bit 기반으로 저장합니다. ANSI 문자(영어 포함)는 그대로(1 바이트로) 아시아 문자는 3 바이트로 가변 표기하는 인코딩 방식입니다.

    '가'를 UTF-8로 표기하려면 범위상 1110xxxx 10xxxxxx 10xxxxxx에 해당하고 '가'가 매핑된 U+AC00은 0xAC00 = 44,032 = 10101100 00000000 이고 이제 x 표시한 부분에 순서대로 넣어주면 됩니다.

    11101010 10110000 10000000

    234       176        128

    EA        B0          80

    이런 식으로 UTF-8이 완성됩니다. A는 그냥 U+0041 -> 0x41입니다. 이런 점에서 UTF-8로 영어 문서를 작성할 경우, 문서의 용량을 줄일 수 있고 ANSI와 호환도 된다는 장점도 있습니다.

    UTF-16

    UTF-8이 8-bit 기반이듯 UTF-16은 16-bit 기반으로 문자열을 저장합니다. 그래서 UTF-16은 모든 문자를 2 바이트로 저장한다는 이야기가 있는데 틀린 말입니다. BMP의 문자들은 2 바이트 그대로 인코딩되고, 그 이상의 문자는 특별한 방식으로 4 바이트 인코딩됩니다. 즉, UTF-16도 엄연한 가변 표기 인코딩입니다.

    UTF-16에서 중요한 것은, 16-bit 기반으로 문자를 저장함으로써 한글 또한 2 바이트로 저장할 수 있다는 것입니다. 이를 통해 한글 문서의 용량을 줄일 수 있습니다. 그 외에 영어+한글 처리 시 크기가 모두 2 바이트이므로 UTF-8보다 편리한 경우도 있습니다. 그러나 ANSI와 호환이 안될 뿐더러, 2 바이트이기 때문에 리틀엔디안, 빅엔디안이 필요하다는 단점이 생깁니다. 윈도우즈 메모장, notepad에서 텍스트 파일 저장 시, 유니코드, 유니코드(big endian)이 바로 UTF-16에 해당합니다.

    ANSI code(=ASCII)

    ASCII(American Standard Code for Information Interchange)

    ANSI로 표현가능한 문자들은 asciitable.com에서 확인가능합니다. 유니코드 중 0x00~0x7f에 해당합니다.

    그런데, ASCII table에는 한글이 없는데 메모장에서 ANSI 인코딩은 어떻게 한글을 저장할까?

    '가'는 B0 A1 로 저장되던데 이에 대한 답은 다음 인코딩에 있습니다.

    EUC-KR

    한글 Windows의 메모장에서 이야기하는 ANSI 인코딩이란, EUC-KR을 말합니다. EUC-KR이란 ANSI를 한국에서 확장한 것입니다. EUC-KR 코드표를 확인해보면 B0 A1에 '가'가 매핑되어있는 것을 확인할 수 있습니다.

    댓글