안녕하세요,
러시아에 살고 있는 개발자 윤진입니다.
C#을 비롯한 .Net 플랫폼에서는 문자를 인코딩하는 방식으로,
Unicode Transformation Format인 UTF-16을 사용합니다.
UTF-16은 기본적으로 16비트-2바이트를 취하지만, 항상 2바이트는 아닙니다.
사상되는 문자의 종류에 따라 4바이트로 확장되기도 합니다.
2바이트로 표현되는 영역은 U+0000부터 U+FFFF까지입니다.
U+0000은 제어 문자와 라틴 기본 영역에 속해있죠.
U+0000 ~ U+007F | 128자 | 제어 문자와 라틴 기본 |
U+FFFF는 특수 제어 문자 영역에 속해있습니다.
U+FFF0 ~ U+FFFF | 16자 | 특수 제어 문자 |
그렇다면, 4바이트 사상되는 U+000000~ 코드 이상의 문자는 무엇을 보고 4바이트 문자인지 판별할 수 있을까요?
이는 2바이트 영역 내에 예약되어있는 '대체 영역' 코드를 통해서입니다.
UTF 코드에는 상위/하위 대체영역으로 두 영역이 할당되어 있습니다.
U+D800 ~ U+DB7F | 896자 | 상위 대체 영역 |
U+DC00 ~ U+DFFF | 1,024자 | 하위 대체 영역 |
캐릭터 코드 2바이트를 읽을때 U+D800~U+DB7F 영역을 의미하는 비트 '1101 1000'이 나오면,
해당 캐릭터는 2바이트가 아닌 4바이트짜리 캐릭터로 인지됩니다.
그 다음 2바이트는 U+DC00~U+DFFF 영역을 의미하는 비트 '1101 1100'로 시작해야합니다.
그렇다면 제대로 된 4바이트짜리 UTF-16 문자가 완성되는 것입니다.
위키피디아의 예시를 보면 보다 명확하게 이해가 가는데,
U+10437 | 0001 0000 0100 0011 0111 | 1101 1000 0000 0001 1101 1100 0011 0111 |
2바이트 영역으로 표현할 수 없는 U+10437 유니코드를 비트로 풀어쓰면,
'0001 0000 0100 0011 0111'로 표현할 수 있습니다.
위의 20비트를 정확히 반으로 갈라서 10비트씩으로 나눕니다.
그리고 앞의 10비트는 상위 대체 영역 비트인 '1101 10'의 뒤에 붙이고,
뒤의 10비트는 하위 대체 영역 비트인 '1101 11'의 뒤에 붙입니다.
U+10000 이상의 영역에 속한 문자는 옛 그리스 문자, 옛 페르시아 문자, 페니키아 문자 등
지금은 거의 사용하지 않는 문자의 영역이지만,
U+1F600 ~ U+1F64F | 80자 |
이모티콘이나 한중일 통합 한자 확장 영역 같은 경우에는 쓸 일이 있을지도 모릅니다.
UTF-16으로 표현할 수 있는 문자수는,
20비트의 공간에 채울 수 있는 1,048,576개의 문자입니다.
아직은 빈공간이 군데군데 보이지만, 언젠가는 꽉 찰지도 모를 일입니다.
유니코드 공식홈페이지에서 현재까지 채워져 있는 유니코드 테이블을 가져다 붙여보겠습니다.
'IT' 카테고리의 다른 글
[C#] readonly 변수를 사용하는 이유는? (30) | 2017.02.02 |
---|---|
[C#] 왜 partial class를 사용하는걸까요? (34) | 2017.02.01 |
[C#] char[]를 string으로 변환하기 (30) | 2017.01.31 |
[C#] bool.Parser vs Convert.ToBoolean() (0) | 2017.01.30 |
[C#] Unicode에서 한글 초성/중성/종성에 대한 짧은 고찰 (0) | 2017.01.29 |
[C#] int.MaxValue 코딩컨벤션에 대한 사소한 의문 (30) | 2017.01.27 |
[C#] 코딩컨벤션, linux_kernel_coding_style vs camelCase vs PascalCase (2) | 2017.01.26 |
[Visual Studio] Start debugging vs Start without debugging (1) | 2017.01.16 |
[Moonlight] 사요나라, 문라이트 프로젝트 (0) | 2017.01.02 |
[러시아] 러시아어 키보드가 어렵다! [모바일 안드로이드 버전편] (2) | 2016.03.17 |