이 도구는 문장 전체를 컴퓨터가 실제로 저장하는 바이트 단위로 풀어 2진수(예: 01001000) 또는 16진수(예: 48) 코드로 보여주고, 그 코드를 다시 문장으로 복원합니다. 네트워크 패킷이나 파일 헥스 덤프를 눈으로 확인할 때, 한글이 왜 깨졌는지 원인을 추적할 때, 인코딩 수업 자료를 만들 때 쓰기 좋습니다. 모든 계산은 브라우저 안에서만 이루어지며 입력한 글이 서버로 전송되지 않습니다.
변환 원리: 문자 → 코드포인트 → UTF-8 바이트
화면의 글자는 먼저 유니코드 코드포인트(예: "가"는 U+AC00)라는 번호를 갖고, 이 번호를 UTF-8 규칙에 따라 1~4바이트로 부호화한 것이 파일과 네트워크에 실제로 기록되는 값입니다. 이 도구가 보여주는 것은 두 번째 단계, 즉 바이트 값입니다. 각 바이트는 8비트이므로 2진수는 항상 8자리(앞쪽 0 포함), 16진수는 항상 2자리로 표시합니다.
UTF-8은 첫 바이트의 앞쪽 비트로 길이를 알립니다. 0으로 시작하면 1바이트, 110으로 시작하면 2바이트짜리의 첫 바이트, 1110이면 3바이트, 11110이면 4바이트이며, 뒤따르는 바이트는 항상 10으로 시작합니다. 아래 표에서 "가"의 코드 11101010 10110000 10000000 이 정확히 이 규칙을 따르는 것을 확인할 수 있습니다.
문자 종류별 UTF-8 바이트 길이
| 코드포인트 범위 | 바이트 수 | 해당 문자 예 |
|---|---|---|
| U+0000 ~ U+007F | 1 | 영문, 숫자, 기본 기호, 제어 문자(ASCII) |
| U+0080 ~ U+07FF | 2 | 라틴 확장(é, ñ), 그리스, 키릴, 히브리, 아랍 문자 등 |
| U+0800 ~ U+FFFF | 3 | 한글 음절(가~힣), 한자, 일본어 가나, €, 대부분의 기호 |
| U+10000 ~ U+10FFFF | 4 | 이모지 대부분, 일부 희귀 한자, 수학 알파벳 기호 |
대표 문자의 실제 변환값 (이 도구와 같은 방식으로 빌드 시 계산)
| 구분 | 문자 | 코드포인트 | 바이트 | 16진수 | 2진수 |
|---|---|---|---|---|---|
| 영문 대문자 | A | U+0041 | 1 | 41 | 01000001 |
| 영문 소문자 | a | U+0061 | 1 | 61 | 01100001 |
| 숫자 0 (문자) | 0 | U+0030 | 1 | 30 | 00110000 |
| 공백 | (공백) | U+0020 | 1 | 20 | 00100000 |
| 라틴 확장 | é | U+00E9 | 2 | c3 a9 | 11000011 10101001 |
| 한글 음절 | 가 | U+AC00 | 3 | ea b0 80 | 11101010 10110000 10000000 |
| 유로 기호 | € | U+20AC | 3 | e2 82 ac | 11100010 10000010 10101100 |
| 이모지 | 😀 | U+1F600 | 4 | f0 9f 98 80 | 11110000 10011111 10011000 10000000 |
검산된 변환 예시
- "Hi" → 2진수: 01001000 01101001 (16진수로는 48 69). H는 십진수 72, i는 105입니다.
- "안녕" → 16진수: ec 95 88 eb 85 95. 글자 2개가 6바이트가 되었고, 이 6바이트를 "코드 → 텍스트"에 넣으면 "안녕"이 그대로 복원됩니다.
- "😀" → 16진수: f0 9f 98 80. 눈에는 한 글자지만 4바이트이며, 자바스크립트의 length는 2로 셉니다(UTF-16 서로게이트 쌍). 바이트 수·글자 수·length가 모두 다를 수 있는 대표 사례입니다.
자주 쓰는 ASCII 문자와 제어 문자
ASCII 범위(0~127)에서는 코드포인트와 바이트 값이 같아서 한 문자가 정확히 한 바이트로 나옵니다. 아래 표는 빌드 시 계산한 값이며, 0~31과 127은 화면에 글자로 보이지 않는 제어 문자입니다.
| 구분 | 10진수 | 16진수 | 2진수 |
|---|---|---|---|
| 널 문자(NUL) | 0 | 00 | 00000000 |
| 탭(TAB) | 9 | 09 | 00001001 |
| 줄바꿈(LF) | 10 | 0a | 00001010 |
| 캐리지 리턴(CR) | 13 | 0d | 00001101 |
| 공백 | 32 | 20 | 00100000 |
| 숫자 0 | 48 | 30 | 00110000 |
| 숫자 9 | 57 | 39 | 00111001 |
| 대문자 A | 65 | 41 | 01000001 |
| 대문자 Z | 90 | 5a | 01011010 |
| 소문자 a | 97 | 61 | 01100001 |
| 소문자 z | 122 | 7a | 01111010 |
| 물결표 ~ | 126 | 7e | 01111110 |
| 삭제(DEL) | 127 | 7f | 01111111 |
글자 수와 바이트 수는 왜 다른가
같은 문자열이라도 "몇 글자인가"는 세는 방법에 따라 값이 달라집니다. 아래 표는 코드포인트 개수, 자바스크립트 문자열의 length(UTF-16 코드 단위), UTF-8 바이트 수를 나란히 계산한 것입니다. 이 도구의 결과 아래 줄에 표시되는 "문자 N개 → M바이트"의 N은 코드포인트 개수, M은 UTF-8 바이트 수입니다.
| 문자열 | 코드포인트 수 | 자바스크립트 length | UTF-8 바이트 수 |
|---|---|---|---|
| Hello | 5 | 5 | 5 |
| Café | 4 | 4 | 5 |
| 안녕하세요 | 5 | 5 | 15 |
| 😀😀 | 2 | 4 | 8 |
| 🇰🇷 (국기 이모지) | 2 | 4 | 8 |
국기 이모지는 눈에는 한 글자지만 지역 표시 문자 두 개가 이어진 것이라 코드포인트는 2개, 바이트는 8개입니다. 글자 수 제한이 있는 서비스는 서비스마다 어떤 기준으로 세는지 달라서, 같은 문장이 어느 곳에서는 통과하고 다른 곳에서는 막힐 수 있습니다.
손으로 따라가 보는 변환 과정
도구가 보여 주는 값이 맞는지 직접 확인하는 방법을 두 가지 소개합니다. 둘 다 위의 UTF-8 규칙만 알면 계산기 없이 따라갈 수 있고, 이 페이지의 값은 모두 같은 규칙으로 다시 계산한 것입니다.
- "Hi"를 2진수로. H는 십진수 72, i는 105입니다. 72를 2진수로 쓰면 1001000(7자리)이므로 앞에 0을 붙여 01001000, 105는 1101001이므로 01101001입니다. 두 바이트를 공백으로 이으면 01001000 01101001입니다.
- "가"(U+AC00)를 세 바이트로. AC00을 2진수로 쓰면 1010 1100 0000 0000(16비트)입니다. 3바이트 형식은 1110xxxx 10xxxxxx 10xxxxxx이므로 16비트를 4비트·6비트·6비트로 나눠 xxxx 자리에 채웁니다. 1010 / 110000 / 000000이므로 11101010 10110000 10000000이 되고, 16진수로는 ea b0 80입니다. "한"(U+D55C)은 같은 방식으로 ed 95 9c가 됩니다.
복원은 반대 방향입니다. 첫 바이트의 앞자리 비트로 길이를 알아내고, 각 바이트에서 표시 비트(1110, 10)를 떼어 낸 나머지 비트를 이어 붙이면 원래의 코드포인트가 나옵니다.
입력 형식별 동작 예시
- 쉼표와 0x 접두사. 16진수 모드에서 "0x48, 0x65, 0x6c, 0x6c, 0x6f"처럼 쉼표와 접두사가 섞여 있어도 쉼표·공백으로 나눈 뒤 0x를 떼어 "Hello"로 복원합니다. 프로그래밍 언어의 배열 리터럴에서 복사한 값을 확인할 때 편합니다.
- 공백 없는 16진수. "48656c6c6f"처럼 짝수 자리로 이어진 한 덩어리는 두 자리씩 끊어 읽지만, 자릿수가 홀수인 한 덩어리(예: 48656c6c6)는 끊지 않고 2자리를 넘는다는 이유로 오류가 납니다.
- 대소문자. 16진수 모드는 a~f와 A~F를 모두 같은 값으로 읽습니다.
- 형식을 잘못 고른 경우. 공백으로 구분한 2진수 코드("01001000 01101001")를 넣고 16진수 모드를 선택하면 8자리 덩어리가 2자리를 넘어 오류가 납니다. 반대로 공백 없이 붙인 8자리 하나("01001000")는 16진수 모드에서 두 자리씩 끊겨 제어 문자 같은 엉뚱한 바이트로 읽히니, 형식 선택과 입력이 맞는지 먼저 확인하세요.
- 값이 모두 0과 1인 16진수. 16진수 모드에서 "10 11"을 넣으면 2진수 2와 3이 아니라 16진수 0x10, 0x11(제어 문자 2개)로 읽습니다.
입력할 때 알아둘 점과 한계
- 이 도구는 UTF-8 전용입니다. 옛 한글 인코딩인 EUC-KR이나 CP949로 저장된 파일의 바이트(한글 1글자 = 2바이트)를 붙여넣으면 UTF-8로 해석되어 오류가 나거나 깨진 글자가 나옵니다. 반대로 이 도구의 결과를 EUC-KR 기준 도구에 넣어도 맞지 않습니다.
- 코드 → 텍스트는 공백(또는 쉼표)으로 바이트를 구분해야 합니다. 2진수 모드에서는 1~8자리의 0/1 덩어리, 16진수 모드에서는 1~2자리 16진수 덩어리를 한 바이트로 읽습니다. 0x 접두사는 자동으로 제거하며, 16진수 모드에서 공백 없이 이어진 짝수 자리 문자열(예: 48656c6c6f)은 두 자리씩 끊어 읽습니다.
- 바이트 순서가 유효한 UTF-8이어야 합니다. 예를 들어 한글 한 글자의 앞 2바이트(ec 95)만 넣으면 문자가 완성되지 않으므로 오류로 안내합니다. 임의의 숫자를 넣었을 때 알 수 없는 글자가 나오거나 실패하는 것도 같은 이유입니다.
- 빈 입력은 변환하지 않고 안내 문구만 표시합니다.
- 이것은 암호화가 아닙니다. 2진수·16진수 변환은 누구나 되돌릴 수 있는 표기 방식의 변경일 뿐 비밀을 지켜주지 않습니다.
- "ASCII 변환기"로 검색해 오셨다면: ASCII는 0~127 범위로, 영문·숫자에서는 UTF-8 결과와 완전히 같습니다. 128 이상의 값은 ASCII가 아니라 UTF-8의 다중 바이트 조각입니다.
실무에서 이 변환이 쓰이는 상황
- 한글이 깨진 원인 추적: 깨진 글자의 바이트를 16진수로 뽑아 보면 인코딩을 짐작할 수 있습니다. 예를 들어 "가"의 UTF-8 바이트 ea b0 80을 EUC-KR로 잘못 읽으면 엉뚱한 한자(媛)가 나타나는데, 이는 같은 바이트를 다른 규칙으로 해석했기 때문입니다.
- 대소문자의 비트 규칙 확인: 대문자 A는 01000001(41), 소문자 a는 01100001(61)로 한 비트(0x20)만 다릅니다. 이 성질 때문에 아스키 표에서 대소문자가 32 간격으로 배치됩니다.
- 보이지 않는 문자 발견: 파일 맨 앞에 ef bb bf가 보이면 UTF-8 BOM(바이트 순서 표시)입니다. 눈에 보이지 않는 공백이나 제로폭 문자도 바이트로 풀어 보면 존재 여부를 확인할 수 있습니다.
- 학습·퀴즈 제작: "Hi"를 2진수로 쓴 01001000 01101001을 퀴즈로 내고, 풀이는 이 도구의 "코드 → 텍스트"로 검증하는 식으로 활용할 수 있습니다.
바이트 값이 아니라 글자 하나의 번호(코드포인트)가 필요하다면 이 도구가 아닌 유니코드 조회 도구를 쓰세요. 예를 들어 "가"의 코드포인트는 U+AC00이고 바이트는 ea b0 80으로, 둘은 같은 값이 아닙니다.
결과 활용법
웹 개발에서 URL에 한글이 퍼센트 인코딩(%EA%B0%80)으로 바뀐 값은 위 16진수 바이트 앞에 %를 붙인 것과 같으므로,URL 인코더의 결과와 대조해 볼 수 있습니다. 숫자 하나의 진법을 바꾸려면진법 변환기, 문자 한 개의 코드포인트를 조회하려면유니코드 문자 정보 조회기, 글자 수와 바이트 수를 함께 세려면 텍스트 바이트 계산기가 더 알맞습니다. 바이트를 텍스트 안전 문자열로 옮기는 Base64는 Base64 변환기를 이용하세요.
자주 묻는 질문
이모지도 변환할 수 있나요?
네. 이모지는 대부분 4바이트(예: 😀는 f0 9f 98 80)입니다. 가족·국기 이모지처럼 여러 이모지를 이어 붙인 조합형은 구성 요소마다 4바이트가 이어져 수십 바이트가 될 수 있습니다.
코드 사이 공백을 빼고 붙여넣으면 안 되나요?
2진수는 공백이 필요합니다. 8자리씩 끊으면 되지만 마지막 덩어리의 자릿수가 불확실해 도구가 임의로 추정하지 않습니다. 16진수는 짝수 자리로 이어진 한 덩어리라면 두 자리씩 자동으로 끊어 읽습니다.
한글이 영어보다 코드가 3배 긴 이유는 무엇인가요?
UTF-8은 영어 호환성을 위해 U+007F 이하를 1바이트로 두고, 한글 음절(U+AC00~U+D7A3)은 3바이트 범위에 속하기 때문입니다. "Hello"는 5바이트, "안녕하세요"는 15바이트입니다. 문자 수 기준이 아니라 바이트 기준 제한(일부 DB 필드, 문자 메시지 등)에서 차이가 납니다.
2진수 코드의 앞쪽 0을 생략해도 되나요?
복원 입력에서는 1~8자리 모두 허용하므로 생략해도 읽힙니다(예: 1001000은 72). 다만 변환 출력은 읽기 쉽도록 항상 8자리로 맞춥니다.
줄바꿈이나 탭도 변환되나요?
네. 줄바꿈(LF)은 0a(00001010), 탭은 09, 공백은 20으로 변환됩니다. Windows에서 복사한 글의 줄바꿈이 CRLF라면 0d 0a 두 바이트로 나올 수 있습니다. 단, 브라우저 입력창은 줄바꿈을 LF로 정규화하는 경우가 많습니다.
결과의 문자 수와 제 글자 수 세기가 다릅니다.
결과 아래 "문자 N개"는 코드포인트 개수입니다. 국기나 가족 이모지처럼 여러 코드포인트가 이어져 한 글자로 보이는 것, 또는 결합 문자가 붙은 글자는 눈으로 센 글자 수보다 크게 나옵니다. 위 표의 국기 이모지가 그 예입니다.
한글 자모(ㄱ, ㅏ)와 완성형 글자(가)의 코드는 같은가요?
다릅니다. 단독 자모와 완성된 음절은 서로 다른 코드포인트이며, 같은 "가"처럼 보여도 자모를 조합해 만든 글자와 완성형 글자는 바이트가 다를 수 있습니다. 눈에 같아 보이는 텍스트를 비교할 때 이 도구로 바이트를 풀어 보면 차이를 찾을 수 있습니다.
변환한 코드를 다른 프로그램에 그대로 붙여넣어 쓸 수 있나요?
16진수 결과는 바이트 단위 값이므로 헥스 에디터나 프로그램의 바이트 배열에 옮겨 쓸 수 있지만, 언어마다 접두사(0x)나 구분자 형식이 다르니 맞게 고쳐야 합니다. 이 도구의 결과는 소문자 두 자리를 공백으로 구분한 평문 형식입니다.
비트열을 8개씩이 아니라 7개씩 끊은 옛 ASCII 자료는 어떻게 하나요?
복원 입력은 1~8자리 2진수를 한 바이트로 읽으므로 7자리씩 공백으로 구분한 값도 ASCII 범위(0~127)라면 그대로 복원됩니다. 다만 8비트 단위로 묶은 UTF-8 바이트열이라는 전제는 같으므로, 글자 사이를 공백으로 구분해 입력해야 합니다.