텍스트·2진수·16진수·10진 바이트 변환 쉽게 이해하기 — 개념과 원리
컴퓨터는 글자를 숫자로 저장합니다. 이 변환기는 텍스트를 대부분의 웹페이지가 쓰는 UTF-8로 인코딩했을 때 정확히 어떤 바이트가 되는지 보여 주고, 그 바이트를 16진수, 2진수, 10진수 세 가지로 적어 줍니다. 인코딩 원리를 배울 때, 글자가 깨지는 문제를 찾을 때, 데이터베이스나 통신 규격의 바이트 제한을 확인할 때, 진법을 가르칠 때 쓸 수 있습니다.
계산 방법
- 텍스트를 UTF-8로 인코딩해 0~255 사이 숫자인 바이트 목록을 얻습니다.
- 16진수: 각 바이트를 두 자리 16진수(00~FF)로 씁니다.
- 2진수: 각 바이트를 여덟 자리 2진수(00000000~11111111)로 씁니다.
- 10진수: 각 바이트를 10진수로 씁니다.
- 바이트 길이: 바이트 개수를 셉니다. 글자 수와 다를 수 있습니다.
원리
유니코드는 모든 글자에 코드 포인트라는 번호를 붙입니다. H는 U+0048, 세는 U+C138입니다. UTF-8은 코드 포인트를 가변 길이 바이트로 저장합니다. U+0000~U+007F(ASCII)는 1바이트, U+07FF까지는 2바이트, 한글 음절이 모두 들어 있는 U+FFFF까지는 3바이트, 대부분의 이모지처럼 그보다 큰 글자는 4바이트입니다. 그래서 ASCII 텍스트는 UTF-8에서도 그대로 같으며, 이것이 UTF-8이 웹 표준이 된 큰 이유입니다. 16진수 한 자리는 정확히 4비트이므로 두 자리가 늘 1바이트를 나타내어 바이트를 보여 줄 때 많이 씁니다.
예제 풀이
- 입력값은 "Hi!"입니다.
- H는 72, i는 105, !는 33이며 모두 ASCII이므로 각각 1바이트입니다.
- 16진수로는 72 = 4 × 16 + 8 = 48, 105 = 6 × 16 + 9 = 69, 33 = 2 × 16 + 1 = 21이므로 48 69 21입니다.
- 2진수로는 72 = 64 + 8 = 01001000, 105 = 64 + 32 + 8 + 1 = 01101001, 33 = 32 + 1 = 00100001이므로 01001000 01101001 00100001입니다.
- 10진수는 72 105 33, 바이트 길이는 3입니다.
결과 해석
영문만 있으면 바이트 길이와 글자 수가 같습니다. 한글은 음절 하나에 3바이트가 들어가므로 "세계"는 6바이트이고, 웃는 얼굴 같은 이모지는 4바이트입니다. UTF-8에서 0으로 시작하는 바이트는 ASCII 한 글자, 10으로 시작하는 바이트는 이어지는 바이트이며, 110, 1110, 11110으로 시작하는 첫 바이트는 각각 2, 3, 4바이트 글자의 시작을 알립니다. 이 규칙을 알면 16진수 덤프에서 여러 바이트 글자가 어디서 시작하는지 쉽게 찾을 수 있습니다.
흔한 실수
- 한 글자가 언제나 1바이트라고 생각하는 경우(한글, 악센트 문자, 이모지에서 틀립니다)
- 2진수에서 앞자리 0을 빼먹는 경우(바이트마다 여덟 자리로 써야 합니다)
- 코드 포인트(U+C138)와 UTF-8 바이트(EC 84 B8)를 혼동하는 경우
자주 묻는 질문
한글 한 글자는 왜 3바이트인가요?
한글 음절은 U+AC00~U+D7A3에 있어 U+07FF보다 크기 때문에 UTF-8로는 3바이트가 필요합니다.
공백은 어떤 바이트인가요?
공백은 10진수 32, 16진수 20, 2진수 00100000입니다.
255바이트 필드에는 몇 글자가 들어가나요?
ASCII는 255글자이지만, UTF-8 한글 음절은 85글자만 들어갑니다.
출처: IETF RFC 3629, UTF-8, a transformation format of ISO 10646 · The Unicode Consortium, The Unicode Standard