UTF-16(16-bit Unicode Transformation Format)은 유니코드 문자 인코딩 방식의 하나이다. 주로 사용되는 기본 다국어 평면 (BMP, Basic multilingual plane)에 속하는 문자들은 그대로 16비트 값으로 인코딩이 되고 그 이상의 문자는 특별히 정해진 방식으로 32비트로 인코딩이 된다.

UTF-16
UCS-2 등의 기본 다언어 플레인(Basic Multilingual Plane) 차트. (확대하려면 클릭)
언어국제
표준유니코드 표준
분류유니코드 변환 포맷, 가변 너비 인코딩
상위 인코딩UCS-2
변환 / 암호ISO 10646 (유니코드)
유니코드
부호화 형식
UCS
양방향 텍스트
BOM
한중일 통합 한자
유니코드 범위 목록
유니코드 등가성
유니코드와 HTML
유니코드와 전자 우편
유니코드 글꼴
v  d  e  h

UTF-16은 유니코드 컨소시엄과 ISO/IEC 10646에 의해 정의되어 있다. 유니코드는 거기에 추가적인 내용을 정하고 있다. 정확한 차이점은 유니코드 4.0 표준의 부록편 C 부분이 자세히 기술되어 있다. ISO 표준은 UCS-2 인코딩도 정의하며 여기선 BMP의 16비트 표현만을 다룬다.

기본 다국어 평면은 U+0000에서 U+FFFF 에 놓인 문자를 담고 있다. 이 영역에는 우리가 쉽게 생각할 수 있는 문자들이 포함되며, 한글, 한자 등은 모두 여기에 포함되어 있다. 이 영역에는 서러게이트 문자(surrogate)들이 준비되어 있어 16비트 이상의 문자를 표현할 때를 대비해 놓았다.

기본 다국어 평면의 문자들은 곧바로 16비트 값으로 대응되어 인코딩되며, 이 경우에는 인코딩된 바이트 스트링의 엔디언만 조심하면 된다.

UTF-16-문자

Bit
|15            8|7             0|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|y y y y y y y y|x x x x x x x x|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

UTF-16BE-코드

    첫 번째 Byte         두 번째 Byte
|7             0| |7             0|
+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+
|y y y y y y y y| |x x x x x x x x|
+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+

UTF-16LE-코드

    첫째 Byte          두 번째 Byte
|7             0| |7             0|
+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+
|x x x x x x x x| |y y y y y y y y|
+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+

기본 다국어 평면에 포함되지 않는 문자들, 즉 16비트로 값을 표현할 수 없는 문자들은 서러게이트(Surrogate) 문자 영역에 해당하는 두 개의 16비트 문자로 변환되어 이 한 쌍(즉 32비트)이 그 문자를 나타내게 된다. 그 자세한 방식은 다음 그림을 통해 설명한다.

Bit
31            24|23           16|15            8|7             0|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|0 0 0 0 0 0 0 0|0 0 0 z z z z z|x x x x x x y y|y y y y y y y y|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

High-Surrogate (U+D800 ... U+DBFF)

|15            8|7             0|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|1 1 0 1 1 0 Z Z|Z Z x x x x x x|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Low-Surrogate (U+DC00 ... U+DFFF)

|15            8|7             0|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|1 1 0 1 1 1 y y|y y y y y y y y|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

유니코드 문자 영역에서 상위 서러게이트는 U+D800에서 U+DBFF 까지의 값을 갖는다. 즉 최상위비트 6개의 값이 그림에서 보듯이 110110으로 일정하다. 마찬가지로 하위 서러게이트는 U+DC00에서 U+DFFF 까지의 값을 가지며 최상위비트 6개의 값은 110111 이 된다. 각 서러게이트 문자는 하위 10비트씩의 자유도를 갖는다. 따라서 주어진 문자를 10비트씩 두조각을 내서 상위 서러게이트와 하위 서러게이트에 배정한 것이다.

여기서 다음을 만족한다.

ZZZZ=zzzzz-1.

이 방법으로 UTF-16 인코딩이 가능한 유니코드 문자의 범위가 나온다.

zzzzz=00000 이라면, 문자는 16비트 이하로 표현이 가능하다. 즉, U+00xxxx 그대로 대응되는 값을 써주면 된다. 그렇지 않다면, ZZZZ=0000..1111 이 되며,zzzzz=00001..10000 = U+01xxxx .. U+10xxxx

이 두 개의 서러게이트 문자는 상위 서러게이트, 하위 서러게이트로서 전송이 된다. 이 방법으로 U+10FFFF 까지의 문자를 인코딩 할 수 있다.

예시

편집
코드 점 문자 UTF-16 코드 값 글리프
122 (hex 7A) 소문자 Z(로마자) 007A z
27700 (hex 6C34) 물 수(한자) 6C34
119070 (hex 1D11E) 높은음자리표 D834 DD1E 𝄞 ( )
水z𝄞
〔UTF-16로 인코드된 물 수, z, 높은음자리표( )〕
인코딩 바이트 순서 바이트 열
UTF-16LE 리틀 엔디언 34 6C, 7A 00, 34 D8 1E DD
UTF-16BE 빅 엔디언 6C 34, 00 7A, D8 34 DD 1E
UTF-16 리틀 엔디언, with BOM FF FE, 34 6C, 7A 00, 34 D8 1E DD
UTF-16 빅 엔디언, with BOM FE FF, 6C 34, 00 7A, D8 34 DD 1E

같이 보기

편집

외부 링크

편집