펄마니아 (www.perlmania.or.kr) 게시판에 위와 같은 글이 올라와 잠시 설명을 해봅니다.

유니코드와 UTF-8은 다릅니다. 문자 코드와 문자 인코딩이 다른 것입니다.
유니코드가 왜 필요한지는 아실테니 그냥 넘어가고, 유니코드는 말 그대로 문자에 대한 코드입니다. 알파벳 'A'는 U+0x0041, 한글의 '가'는 U+0xAC00로 나타낼 수 있는데, 여기서의 'U'는 유니코드의 시작점이고, 뒤쪽의 16진수는 유니코드의 정의 테이블에서 각 문자가 어디에 위치하고 있는지를 나타냅니다. (이를 코드 포인트라고 합니다.) 이 유니코드 테이블은 정의가 완료된 상태가 아니며, 앞으로도 계속 크기가 커질 것입니다. (www.unicode.org에서 계속 작업중입니다.)

이런 식으로 현재 유니코드 표준에 포함된 문자들은 각자의 고유한 코드포인트를 가지고 있습니다. 최초에 유니코드가 나왔을때는 거의 모든 문자의 코드포인트가 2^16 범위 안에 들어와서 아스키 문자는 1바이트, 유니코드는 2바이트라는 이상한 정의가 통했지만, 지금은 꼭 그렇지는 않습니다. 중요한 것은, 유니코드는 특정 바이트의 수로 정의할 수 없는 추상적인 위치라는 거지요.

그럼 이 문자들을 실제 컴퓨터에서는 어떻게 표현하는 것이 좋을까요? 그리고 이기종 컴퓨터간에는 유니코드 문자열을 어떻게 주고받을 수 있을까요? 여기서 필요한 것이 유니코드의 인코딩 방식입니다. UTF8, UTF16, UTF16-BE, UTF16-LE, UCS2, UCS4 이런 다양한 인코딩 방식이 유니코드를 인코딩하는 데 사용되고 있습니다.

UCS2, UTF16 계열은 모든 문자를 2바이트(16비트)로 인코딩합니다. 초창기 유니코드를 프로그래밍한다 하면 대부분 이 인코딩을 생각했습니다. 그리고 C/C++에서도 wchar_t가 2 byte로 정의되어 있는 경우가 대부분입니다. 이렇게 무조건 문자를 2바이트로 표시하면, 대부분의 유럽문자, 한글, 한자, 일본어 등이 표현 가능합니다. 하지만 한글 고대어 등등... 2^16 범위를 넘어가는 코드 포인트의 문자는 표현할 수 없습니다. (A는 0x00, 0x41, 한글 '가'는 0xAC, 0x00 이런 식으로 표현하는 거죠. 이 경우에는 동아시아 문자같은 멀티바이트 문자들은 낭비가 없지만, 영문자만 사용하는 국가들에서는 첫번째 바이트를 무조건 0x00으로 맞춰야 하므로 낭비가 생깁니다.)

UCS4는 유니코드 문자를 4바이트로 인코딩합니다. 이러면 현존하는 유니코드 3.0 규약의 모든 문자를 표현할 수 있습니다만, 메모리 및 네트웍 트래픽, 데이터의 낭비가 너무 심하겠죠.

그래서 몇몇 머리 좋은 사람들이 UTF-8을 만듭니다. UTF-8은 가변길이의 인코딩으로, 모든 유니코드 문자를 표현할 수 있습니다. 대신 약간의 비트 연산이 필요합니다.

UTF-8은 U+0000부터 U+007F 까지의 문자들은 그대로 1바이트로 표기합니다. 유니코드의 정의상 이 부분은 ASCII 코드와 그대로 일치하므로, 기존 아스키 문자열도 그대로 호환됩니다.
U+007F보다 큰 코드포인트의 문자들은 그 범위에 따라 각각 2바이트, 3바이트, 4바이트로 인코딩될 수 있습니다.

다음 비트 표를 보시면 이해가 쉬우실 겁니다.

U-00000000 - U-0000007F:  0xxxxxxx (1바이트 : 대부분의 영문자)
U-00000080 - U-000007FF:  110xxxxx 10xxxxxx
U-00000800 - U-0000FFFF:  1110xxxx 10xxxxxx 10xxxxxx (3바이트 : 한글)
U-00010000 - U-001FFFFF:  11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
U-00200000 - U-03FFFFFF:  111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
U-04000000 - U-7FFFFFFF:  1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx

UTF-8이 가장 낭비가 없이 모든 유니코드를 표현할 수 있기 때문에, 점차 인코딩 표준이 될 것이라 생각됩니다. (영어만 사용한다면 이게 최고죠...) 한글은 현대 한글기준으로 보면 대부분 UTF-8 인코딩으로 3바이트로 표현됩니다. UCS2보다는 1바이트 더 쓰지만 어디 한글만 쓸일 있나요~

설명하는 재주가 없어서 다소 장황합니다만, 명랑 유니코드 세상이 오기를 기원하며 몇 자 적어보았습니다. 도움이 되셨길 바랍니다~

Posted by leigh
◀ PREV : [1] : [2] : [3] : [4] : [5] : ... [9] : NEXT ▶

BLOG main image
by leigh

공지사항

카테고리

분류 전체보기 (9)
블랙베리 (5)

최근에 받은 트랙백

Total : 33,239
Today : 3 Yesterday : 8