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개 코드 포인트를 차지한다.
프로그래밍 관련 정보 |
|||||||||
---|---|---|---|---|---|---|---|---|---|
문자 인코딩 | |||||||||
문자 집합 |
|
||||||||
프로그래밍 언어 | |||||||||
마크업 언어 | |||||||||
표준과 API와 규격 | |||||||||
라이브러리 | |||||||||
프레임워크 | |||||||||
개발 소프트웨어 | |||||||||
튜토리얼 |
유니코드 블록 |
|||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
※아래 한국어 표기는 공식 번역이 아니다. 원문 목록은 유니코드#유니코드 블록 목록 또는 분류:유니코드 블록을 참고. |
|||||||||||||
BMP |
| ||||||||||||
SMP |
|
||||||||||||
SIP | |||||||||||||
TIP | |||||||||||||
SSP | |||||||||||||