UTF-8 바이트 크기 계산기
입력
| 텍스트 | Héllo |
|---|
UTF-8 바이트 크기 계산기
아무 텍스트나 입력하면 UTF-8 바이트 크기, UTF-16 바이트 크기, 문자 수(코드 포인트 수)를 확인할 수 있습니다. ASCII 문자는 UTF-8에서 한 글자당 1바이트, 악센트가 있는 라틴 문자는 2바이트, 한글·한자 등 대부분의 문자는 3바이트, 이모지는 4바이트를 차지합니다. 그래서 문자열의 바이트 크기가 눈에 보이는 문자 수보다 클 수 있습니다.
입력
텍스트
결과
값을 입력하면 계산 결과가 표시됩니다.
크기
UTF-8 바이트 크기
문자열과 그것이 차지하는 바이트 수는 같지 않습니다. 화면에서 한 단어는 문자의 나열이지만, 저장과 전송에서는 바이트의 나열이며, 두 값이 일치하는 경우는 드뭅니다. 이 계산기는 텍스트를 입력받아 세 가지 수를 알려줍니다. 텍스트에 들어 있는 문자(유니코드 코드 포인트)의 수, UTF-8로 차지하는 바이트 수, UTF-16으로 차지하는 바이트 수입니다. 데이터베이스 열을 설계하거나, API와 메시지 길이 제한을 확인하거나, 짧아 보이는 문자열이 의외로 큰 이유를 이해하는 데 유용합니다.
문자와 바이트
문자는 표기의 단위입니다. 글자, 숫자, 표의문자, 이모지가 여기에 해당합니다. 유니코드는 각각에 코드 포인트라는 번호를 부여하며, U+00E9처럼 표기합니다. 바이트는 저장의 단위로 8비트입니다. 인코딩은 코드 포인트를 바이트로 바꾸는 규칙이며, 인코딩이 다르면 같은 텍스트라도 바이트 수가 달라집니다.
영문 위주의 텍스트에서는 이 차이를 알아차리기 어렵습니다. 흔히 쓰이는 인코딩에서 ASCII 문자가 우연히 딱 떨어지는 바이트 수가 되기 때문입니다. 텍스트에 악센트 문자, 한글 같은 비라틴 문자, 이모지가 들어가는 순간 차이가 드러납니다.
UTF-8에서 한 문자의 바이트 수
UTF-8은 가변 길이 인코딩으로, 한 문자는 코드 포인트에 따라 1~4바이트를 차지합니다.
U+0000–U+007F(ASCII: 악센트 없는 라틴 문자, 숫자, 일반 문장 부호): 1바이트U+0080–U+07FF(라틴 악센트, 그리스 문자, 키릴 문자, 히브리 문자, 아랍 문자): 2바이트U+0800–U+FFFF(한글, 대부분의 CJK 등): 3바이트U+10000이상(이모지, 드문 문자): 4바이트
ASCII 문자가 그대로 1바이트로 유지되기 때문에 UTF-8은 ASCII와 호환됩니다. 이것이 UTF-8이 웹과 텍스트 파일의 기본 인코딩이 된 큰 이유입니다.
UTF-16에서 한 문자의 바이트 수
UTF-16은 대부분의 문자를 하나의 16비트 코드 단위, 즉 2바이트로 저장합니다. U+FFFF를 넘는 문자(이모지나 그 밖의 드문 기호)는 두 개의 코드 단위로 이루어진 서로게이트 쌍으로 저장되어 4바이트를 차지합니다. 1바이트인 경우는 없으며, 평범한 ASCII 글자도 UTF-16에서는 2바이트가 듭니다. 이는 Java, C#, JavaScript 같은 언어가 메모리에서 쓰는 문자열 형식입니다.
풀이 예시
텍스트 Héllo를 살펴봅니다.
문자는 5개지만 UTF-8 바이트는 6개입니다. é가 2바이트 범위에 들기 때문입니다. UTF-16에서는 5개의 문자가 각각 2바이트 코드 단위가 되어 10바이트가 됩니다.
이제 이모지 하나 😀(U+1F600)를 봅니다. 한 문자이지만 U+FFFF를 넘습니다. UTF-8은 이를 4바이트로 인코딩하고, UTF-16은 서로게이트 쌍으로 저장하여 역시 4바이트가 되지만, 문자 수는 단 1입니다.
바이트 크기가 중요한 이유
실제 시스템의 한계는 보통 문자가 아니라 바이트로 셉니다. VARCHAR(255)로 선언한 열은 데이터베이스 엔진과 문자 집합에 따라 바이트 또는 문자를 제한할 수 있습니다. 메시지 길이 제한, API 페이로드 필드, HTTP 헤더 크기, 폼 검증도 흔히 바이트로 표현됩니다. UTF-8 바이트 크기를 미리 측정해 두면 값이 들어갈지, 얼마나 많은 공간과 대역폭을 쓸지 알 수 있는데, 이는 문자 수만으로는 알 수 없는 정보입니다.
관련 계산기
문자열의 실제 바이트 값을 2진수, 16진수, 10진수 코드로 보려면 텍스트 → 2진수 / 16진수 / ASCII 변환기를 사용하세요. 텍스트를 전송을 위해 Base64로 감싼 뒤의 크기를 측정하려면 Base64 인코딩 오버헤드 계산를 참고하세요. 그리고 문자열이 차지하는 공간이 아니라 담고 있는 정보량을 추정하려면 섀넌 엔트로피 계산가 그 엔트로피를 계산합니다.
자주 묻는 질문 (FAQ)
바이트 크기가 문자 수보다 큰 이유는 무엇인가요?
문자는 눈에 보이는 것이고, 바이트는 저장되는 방식입니다. UTF-8에서는 기본 ASCII 문자(악센트 없는 라틴 문자, 숫자, 일반 문장 부호)만 1바이트에 들어갑니다. é 같은 악센트 문자는 2바이트, 대부분의 다른 문자는 3바이트, 이모지는 4바이트를 사용합니다. 따라서 ASCII가 아닌 문자가 포함된 텍스트는 문자 수보다 더 많은 바이트를 차지합니다.
UTF-16에서는 ASCII 텍스트라도 각 문자가 최소 2바이트를 쓰기 때문에 그 차이가 더 큽니다.
UTF-8과 UTF-16의 차이는 무엇인가요?
둘 다 유니코드 문자를 바이트로 바꾸는 방식입니다. UTF-8은 문자당 1~4바이트의 가변 길이를 쓰며 ASCII와 호환되어 웹과 파일에서 가장 널리 쓰이는 인코딩입니다. UTF-16은 대부분의 문자를 2바이트로, 기본 다국어 평면(BMP)을 넘는 드문 문자(이모지 등)는 4바이트로 표현합니다. Java, C#, JavaScript 같은 언어의 메모리 내 문자열 표현으로 흔히 쓰입니다.
라틴 문자 위주의 텍스트에서는 UTF-8이 더 작고, 동아시아 문자가 많은 텍스트에서는 둘이 비슷한 경우가 많습니다.
한 문자는 몇 바이트를 차지하나요?
UTF-8에서는 코드 포인트에 따라 다릅니다. U+0000U+007F(ASCII)는 1바이트, U+0080U+07FF(라틴 악센트, 그리스 문자, 키릴 문자, 히브리 문자, 아랍 문자)는 2바이트, U+0800~U+FFFF(대부분의 CJK 등)는 3바이트, U+10000 이상(이모지, 드문 문자)은 4바이트입니다.
UTF-16에서는 같은 문자가 U+FFFF까지는 2바이트, 그 이상은 서로게이트 쌍으로 4바이트를 차지합니다.
바이트 크기는 언제 중요한가요?
저장과 전송은 문자가 아니라 바이트 단위로 측정됩니다. VARCHAR(255)로 선언한 데이터베이스 열은 엔진과 문자 집합에 따라 바이트 또는 문자를 제한할 수 있습니다. API 필드, 메시지 길이 제한, 폼 입력 제한도 바이트로 표현되는 경우가 많습니다. UTF-8 바이트 크기를 미리 알면 값이 들어갈지, 얼마나 많은 공간과 대역폭을 쓸지 가늠하는 데 도움이 됩니다.