C++20부터 char8_t, u8string등 UTF-8을 지원하기 위한 타입이 추가되었으나, 다른 라이브러리와의 호환등을 위해 개인적으론 아직 char와 string을 주로 사용하고 있다.
UTF-8에서 한글은 3바이트를 사용하는데, UTF-8 문자 "가" 는 각 바이트에 234, 176, 128로 저장된다.
유니코드표에서 "가"를 찾아보면 U+AC00 이라고 되어있고, AC00는 2바이트(172, 0) 값인데, 저렇게 저장되는 이유는 각 바이트는 다음 그림과 같은 기본 규칙이 있기 때문이다.
표에 의하면 기본적으로 3바이트를 쓰는 한글은 기본 1110xxxx 10xxxxxx 10xxxxxx 값이 정해져 있고, 유니코드의 HEX값은 x에 치환되는 값만 표에 적어둔 것이다.
0xAC00을 0b로 변경하면 1010 110000 000000 인데 해당 비트의 갯수와 위 x의 갯수가 동일한 것을 볼 수 있다.
두 비트 값을 자릿수에 맞춰 OR하면 11101010 10110000 10000000가 나오는데, 각각 8비트씩 10진수로 변경해보면 아까 봤던 234, 176, 128이 되는 것이다.
그럼 앞으로 문자열을 유니코드 code point 값과 쉽게 비교하기 위해 code point로 변환하는 방법을 알아보자.
앞의 "가" 에 대한 설명을 역순으로 계산해보자
A = 234; // 11101010
A = A & 0xF (하위 4개 비트만 가져오기)
B = 176; //10110000
B = B & 0x3F (하위 6개 비트만 가져오기)
C = 128; //10000000
C = C & 0x3F (하위 6개 비트만 가져오기)
CodePoint = (A << 12) | (B << 6) | C = AC00;
으로 계산할 수 있다.
유니코드 블록 목록
'프로그래밍 > C,C++' 카테고리의 다른 글
Release 프로그램의 비정상 종료시 덤프를 무조건 남기기 (0) | 2024.06.20 |
---|---|
타입에 따른 템플릿 오버로딩 (1) | 2024.01.10 |
[RapidJson] 가변 파라미터 함수로 json 값 추가하기 (0) | 2023.05.08 |
확인할 수 없는 외부 기호 (0) | 2021.12.30 |
memmove_s 함수 (0) | 2021.12.27 |