유니코드 코드 포인트 확인 쉽게 이해하기 — 개념과 원리
모든 글자는 유니코드 코드 포인트라는 번호로 저장되며, U+ 뒤에 16진수 네 자리 이상으로 적습니다. 이 번호를 실제 바이트로 바꾸는 것이 인코딩이고, 파일과 웹에는 주로 UTF-8, 자바스크립트·자바에는 UTF-16을 씁니다. 이 도구는 글자마다 코드 포인트, UTF-8 바이트, UTF-16 단위를 보여 주어 글자 깨짐을 추적하거나 저장 용량을 확인할 때 도움이 됩니다.
계산 방법
- 코드 포인트: 유니코드 표준이 부여한 번호로 U+0000~U+10FFFF입니다.
- UTF-8: U+007F까지 1바이트, U+07FF까지 2바이트, U+FFFF까지 3바이트, 그 이상은 4바이트입니다. 첫 바이트가 길이를 알려 주고, 뒤따르는 바이트는 10xxxxxx 꼴로 6비트씩 담습니다.
- UTF-16: 기본 다국어 평면(BMP, U+FFFF까지)은 16비트 단위 하나로 씁니다. 그 밖의 문자는 0x10000을 뺀 20비트를 나누어 0xD800 + 위 10비트, 0xDC00 + 아래 10비트의 대리 쌍으로 씁니다.
- 개수: 코드 포인트 수 / UTF-16 단위 수(자바스크립트 .length) / UTF-8 바이트 수입니다.
원리
유니코드는 '어떤 글자인가'와 '몇 바이트로 저장하는가'를 분리합니다. UTF-8은 ASCII를 1바이트 그대로 두고, 이어지는 바이트가 항상 10으로 시작하므로 중간부터 읽어도 글자 경계를 찾을 수 있습니다. UTF-16은 문자용으로 비워 둔 U+D800~U+DFFF 영역을 대리 쌍으로 써서 1,114,112개 코드 포인트를 모두 표현합니다.
예제 풀이
- 입력은 한😀A, 세 글자입니다.
- '한'은 U+D55C입니다. 비트 1101 010101 011100을 3바이트 틀에 넣으면 ED 95 9C, UTF-16은 D55C 하나입니다.
- 😀는 U+1F600으로 BMP 밖입니다. UTF-8은 F0 9F 98 80이고, UTF-16은 0xF600의 위 10비트 0x3D와 아래 10비트 0x200으로 D83D DE00이 됩니다.
- 'A'는 U+0041로 UTF-8 41, UTF-16 0041입니다.
- 코드 포인트 3개, UTF-16 단위 1 + 2 + 1 = 4개, 바이트 3 + 4 + 1 = 8개로 3 / 4 / 8입니다.
결과 해석
UTF-16 길이가 문자 수보다 크면 이모지처럼 BMP 밖의 문자가 들어 있다는 뜻입니다. 한글 완성형 음절(U+AC00~U+D7A3)은 UTF-8에서 항상 3바이트, UTF-16에서 단위 1개입니다.
흔한 실수
- 한 글자를 1바이트로 보거나 .length를 글자 수로 여기는 것
- 대리 쌍이나 다중 바이트 중간을 잘라 글자를 깨뜨리는 것
- 피부색·가족 이모지를 코드 포인트 하나로 여기는 것
자주 묻는 질문
MySQL utf8 열에 이모지가 안 들어가는 이유는 무엇입니까?
예전 utf8(utf8mb3)은 글자당 최대 3바이트만 저장합니다. utf8mb4를 쓰면 됩니다.
UTF-16은 항상 글자당 2바이트입니까?
아닙니다. U+FFFF를 넘는 문자는 대리 쌍으로 4바이트를 씁니다.
새 파일에는 어떤 인코딩이 좋습니까?
웹과 대부분의 도구가 기본으로 쓰는 UTF-8을 권합니다.
출처: The Unicode Consortium, The Unicode Standard, Chapters 2 and 3 · IETF RFC 3629, UTF-8, a transformation format of ISO 10646 · IETF RFC 2781, UTF-16, an encoding of ISO 10646