제목:

서러게이트 영역, 무엇인가?

날짜: Posted on

서러게이트 영역(Surrogate area)은 유니코드의 UTF-16 인코딩에서 확장 평면 범위(U+10000 – U+10FFFF)의 문자를 표현하기 위해 할당된 특수 영역입니다.

서러게이트 영역에 해당하는 코드포인트 범위는 U+D800부터 U+DFFF까지의 2048개 포인트입니다. 이 중 앞의 절반(U+D800부터 U+DBFF까지)은 상위 서러게이트 영역, 뒤의 절반(U+DC00부터 U+DFFF까지)은 하위 서러게이트 영역입니다. 상위 서러게이트 영역과 하위 서러게이트 영역에서 문자 한 쌍을 서로 이어붙여 확장 평면 문자를 표현하는 것입니다. 이를 서러게이트 페어(Surrogate pair)라고 부릅니다.

구조

상위 서러게이트와 하위 서러게이트의 코드포인트 값을 2진수로 나타내면 다음과 같습니다.

  • 상위: 1101 10xx xxxx xxxx
  • 하위: 1101 11xx xxxx xxxx

여기서 x의 자리에 확장 평면 범위의 코드포인트 값에서 65536만큼 뺀 값이 10비트씩 나뉘어서 들어갑니다.

예시

예를 들어, 보충 다국어 평면에 있는 높은음자리표(𝄞)를 표현하자면 이렇습니다.

높은음자리표의 코드포인트가 U+1D11E이므로 여기서 65536(0x10000)을 빼면 0xD11E가 되고, 이를 2진수로 나타내면 0000 1101 0001 0001 1110이 됩니다.
이를 10비트씩 반으로 자르면 앞은 00 0011 0100, 뒤는 01 0001 1110입니다. 여기서 앞의 10비트를 상위 서러게이트에 대입하고 뒤의 10비트를 하위 서러게이트에 대입하면,

  • 상위: 1101 1000 0011 0100
  • 하위: 1101 1101 0001 1110

이렇게 됩니다.
이 값을 16진수로 변환하면 상위 서러게이트는 0xD834, 하위 서러게이트는 0xDD1E가 됩니다.

그러므로 높은음자리표를 UTF-16 인코딩으로 나타내려면 서러게이트 문자 U+D834와 U+DD1E를 서로 이어붙여서 나타내는 것입니다.

이 방법을 사용하여 표현 가능한 코드포인트는 U+10FFFF까지입니다. 유니코드 표준에서 U+10FFFF까지(실질적으로 U+10FFFD까지) 사용하도록 표준화한 이유가 UTF-16 인코딩에서의 표현 가능 범위를 고려한 것입니다.

한편, JSON의 경우 유니코드의 문자를 이스케이프할 때는 \uxxxx 식으로 백슬래시(\)와 u를 쓰고 x의 자리에 코드포인트의 16진수를 쓰는데(예: 한글 완성자 ‘가’를 이스케이프할 경우 \uac00) 이 때도 서러게이트 페어를 이용합니다. 즉 앞의 예로 든 높은음자리표를 JSON에서 이스케이프하려면 \ud834\udd1e 이렇게 됩니다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다