UTF-16
은 UTF-32
에 비해 표현할 수 있는 문자수가 적으나 효율면이나 현재 보편적인 사용면에서 우위를 차지하고 있다. 그래서 UTF-16
을 유지하면서 문자 표현이 부족한 부분을 기술적으로 해결하고자 하는 것이 서러게이트(surrogate)이다.
2003년 4월 유니코드(unicode) 4.0이 등장한 이후로 컴퓨터로 표현하고자 하는 문자의 수는 계속 늘어났고 UTF-16
(2
바이트이며 최대 65,536
)으로는 모두 표현하기 어려운 지경에 이르렀다. 그래서 등장한 인코딩 기술이UTF-32
(4
바이트이며 최대 4,294,967,296
표현)이다. UTF-32
는 32
비트 기반으로 문자를 표현한다. 기본 비트수가 늘어났으니 유니코드 버전 업데이트는 환영받지 못할 일은 아니다.
사실 문자 인코딩은 소프트웨어 개발에서 매우 중요한 요소이다. 한번 설계해 놓은 것을 바꾸기는 쉽지 않다. 따라서 현재 운용중인 UTF-16
(2
바이트) 기반의 소프트웨어에 유니코드 4.0 이상을 반영하려면 UTF-32
(4
바이트)로 변경하는 시도를 해야하는 데 이게 좀 까다롭다. 그리고 좀 더 많은 문자를 사용하기 위해서 UTF-32
로 설계하는 것은 시스템 가용력을 올리는 꼴이 될 수도 있다. 대안을 찾아야 한다. 사실 UTF-16
은 이미 4
바이트의 표현을 위해 미리 준비해 둔 방법이 있다. 그런데 그게 꽤나 복잡하다는 게 문제이다.
UTF-16
을 유지하면서 유니코드 4.0 이상을 지원할 수는 없을까? 이게 가능했던 모양이다. 그래서 등장한 것이 서러게이트이다. 유니코드 다국어 기본 평면에 속하는 문자(근대 문자와 특수 문자)는 최대 2
바이트를 사용한다. 그리고 평면외의 문자는 4
바이트를 사용한다. 그런데 원칙적으로 16
비트에서 4
바이트를 표현할 수 없다. 4
바이트를 표현하기 위해서는 32
비트 기반을 사용해야 한다. 따라서 UTF-16
에서 4
바이트를 사용해야 하는 문자는 다음의 설명과 같이 복잡한 방법을 사용한다.
유니코드 다국어 기본 평면에는 문자가 할당되지 않은 영역이 존재한다. 첫 번째는 비트가 110110
로 시작하는 상위 서러게이트(high surrogate)라는 영역(U+D800
~ U+DBFF0
)이고 두 번째는 110111
로 시작하는 하위 서러게이트(low surrogate) 영역(U+DC00
~ U+DFFF
)이 존재한다. 그렇기 때문에 두 영역을 의미하는 6
개의 비트 조합으로 시작하지 않는다면 유니코드 다국어 기본 평면에 있는 문자임을 알 수 있다.
총 16
비트에서 앞쪽 6
비트는 서러게이트 영역임을 표시하고 나머지 10
비트는 자유롭게 사용이 가능하다. 그래서 4
바이트로 표현해야 할 문자를 10
비트씩 나누어서 상위 서러게이트와 하위 서러게이트에 할당한다. 총 20
비트로 표현이 가능한 숫자는 1,048,576
이므로 이러한 방법으로 UTF-16
인코딩 범위 밖의 문자도 어느 정도는 표현이 가능하다.
상위 서러게이트와 하위 서러게이트가 짝을 이루어 4
바이트를 표현하는 의미의 명칭이다.