UTF-16

UTF-16유니코드 문자 인코딩 방법 중 하나로, UTF-8과 함께 주로 쓰이는 포맷이다. 명칭은 Unicode Transformation Format – 16-bit 또는 Universal Coded Character Set Transformation Format – 16-bit의 약자이다.

인코딩 방법[편집 | 원본 편집]

기본적으로 문자 인코딩은 16비트, 즉 2바이트로 표현된다. 이 경우 U+0000부터 U+FFFF까지 표현이 가능하다. 그런데 실제 유니코드 체계에서는 U+10000 이후 영역, 즉 기본 다국어 평면(BMP) 밖에 있는 문자들도 있기에 기본 규칙만으로는 한계가 있다. BMP 내에 있는 문자들과 구분하고자 32비트 표현 방식이 따로 주어져 있는데 그 방법은 아래와 같다.

U+10000 이후의 문자는 110110yy yyxxxxxx 110111xx xxxxxxxx와 같이 표현된다. 여기서 y 표시 4개는 유니코드 평면 번호에서 1을 뺀 값을 나타내고, x 표시 16개는 유니코드 값 중 마지막 16비트, 즉 16진수 기준 마지막 네 자리를 의미한다. 첫째와 셋째 바이트의 110110--, 110111-- 부분은 고정된 비트로 각각 32비트 인코딩의 앞·뒤 부분임을 표시한다. 변수 부분은 총 20비트이므로, 이 표현 방식으로 220가지 문자를, 달리 말해 16개 유니코드 평면 내 문자들을 커버할 수 있다.

0번 평면(BMP) 부분은 상술한 16비트 표현으로 나타낼 수 있기에, 32비트 표현 영역에서는 0~15번 대신 1~16번 평면을 담당한다. 때문에 yyyy 부분은 유니코드 평면 번호에서 1을 뺀 값으로 표시한다.

인코딩 예[편집 | 원본 편집]

'리'(U+B9AC)를 UTF-16으로 표현하려고 할 때, 이 글자는 U+FFFF 이전 글자이므로 16비트 그대로 나타내면 된다. 즉 B9 AC가 인코딩 결과이다.

그렇다면 '𨭎'(U+28B4E)의 경우는? 이 한자는 2번 평면(SIP)에 속해 있으므로 32비트 방식을 따른다. 평면 번호에서 1을 빼면 yyyy=0001이 된다. 또, 16진수 표현 중 마지막 네 자리는 8B4E이므로, 이를 이진법으로 표현하면 10001011 01001110이며 이것이 x 표시 16개에 해당한다.

그러므로 위 문단의 틀에다 비트를 대입하면 11011000 01100010 11011111 01001110이다. 앞의 밑줄은 y표시 4개와 x 표시 앞 6개가 붙어 있으며, 뒤의 밑줄은 x 표시 뒤 10개이다. 따라서 인코딩 결과는 D8 62 DF 4E이다.

UTF-8과의 차이[편집 | 원본 편집]

UTF-8에서는 BMP 영역 내 문자들이 1~3바이트로 갈라지는 반면 UTF-16은 2바이트로 일정하다. U+0800~U+FFFF 영역의 문자들은 UTF-80에서보다 인코딩 길이가 글자 당 1바이트씩 짧아진다. 하지만 반대로 U+0000~U+007F, 즉 ASCII 영역의 문자들은 반대로 글자당 1바이트씩 길어진다.

한글이나 한자, 가나와 같은 음절문자나 표의문자 위주로 이루어진 글을 인코딩할 때에는 UTF-16이 짧지만, 서구권에서 쓰는 라틴 문자 중심의 글은 UTF-8이 유리하다.

서로게이트[편집 | 원본 편집]

앞서 소개한 110110yy yyxxxxxx 110111xx xxxxxxxx 방식의 인코딩만 보면 이것이 32비트 표현 하나인지 16비트 표현 둘인지 구분이 되지 않는다. 하지만 이 부분은 혼동의 여지가 없는 것이, 110110--이나 110111--로 시작하는 16비트 유니코드 값은 문자가 배당되어 있지 않다.

서로게이트(Surrogates) 또는 대체 영역은 UTF-16에서 32비트 인코딩을 제공할 수 있게 지정해둔 유니코드 블록이다. 모두 2048개 코드 포인트가 있으며, 이는 110110--으로 시작하는 1024개 및 110111--로 시작하는 1024개로 나뉜다.

High Surrogates[편집 | 원본 편집]

High Surrogates
이름의 뜻 상단 서로게이트
유니코드 평면 BMP
코드 범위 U+D800 ~ U+DB7F
코드 개수 896
글자 수 0
미사용 글자 896
종류 서로게이트
쓰기 방향 N/A
이전 블록 Hangul Jamo Extended-B
다음 블록 High Private Use Surrogates
관련 블록 본문 참고
추가된 버전 2.0

High Surrogates는 UTF-16의 32비트 표현 중 앞의 16비트를 담당하는 영역이다. 범위는 2진수로 11011000 00000000부터 11011011 01111111까지인데, 앞서 언급한 y 표시 4개는 0000부터 1101까지에 해당한다. 이는 유니코드 평면 번호로 1번부터 14번까지를 담당한다.

High Private Use Surrogates[편집 | 원본 편집]

High Private Use Surrogates
이름의 뜻 상단 사용자 정의 서로게이트
유니코드 평면 BMP
코드 범위 U+DB80 ~ U+DBFF
코드 개수 128
글자 수 0
미사용 글자 128
종류 서로게이트
쓰기 방향 N/A
이전 블록 High Surrogates
다음 블록 Low Surrogates
관련 블록 본문 참고
추가된 버전 2.0

High Private Use Surrogates는 마찬가지로 앞의 16비트를 담당하는 영역이지만 이쪽은 유니코드 평면 15번과 16번을 맡는다. 이 두 평면은 사용자 정의 영역 평면, 즉 PUA-A와 PUA-B에 해당하기에 상단 서로게이트 중에서도 '상단 사용자 정의' 서로게이트로 분류한다. 코드 범위는 2진수로 11011011 10000000부터 11011011 11111111까지이며, y 표시 4개는 1110, 1111 둘 중 하나이다.

Low Surrogates[편집 | 원본 편집]

Low Surrogates
이름의 뜻 하단 서로게이트
유니코드 평면 BMP
코드 범위 U+DC00 ~ U+DFFF
코드 개수 1024
글자 수 0
미사용 글자 1024
종류 서로게이트
쓰기 방향 N/A
이전 블록 High Private Use Surrogates
다음 블록 Private Use Area
관련 블록 본문 참고
추가된 버전 2.0

Low Surrogates는 뒤의 16비트를 담는 영역으로, 해당 코드 범위는 2진수로 110111xx xxxxxxxx 형태이다. x 표시 10개 부분이 변수이며 1024개 코드 포인트를 차지한다.

각주