Unicode 인코딩 변환 도구
텍스트와 Unicode 인코딩 간 상호 변환, 다양한 형식 출력 지원
문자 코드포인트 상세 (클릭하여 복사)
Unicode란?
Unicode(통일 부호)는 컴퓨터 과학 분야의 산업 표준으로, 세계 대부분의 문자 체계를 정리하고 인코딩합니다. 각 Unicode 문자에는 고유한 숫자 번호가 부여되며, 이를 코드포인트(Code Point)라고 합니다. 일반적으로 16진수로 표시하고 U+ 접두사를 붙입니다. 예를 들어 U+4E2D는 한자 '中'을 나타냅니다. Unicode 인코딩 변환 도구는 텍스트를 다양한 Unicode 표기 형식으로 변환하거나, Unicode 코드를 텍스트로 복원할 수 있습니다.
사용 방법
단계
- 변환할 텍스트를 입력 상자에 입력하거나 붙여넣으세요
- 변환 방향을 선택하세요: Text to Unicode 또는 Unicode to Text
- 출력 형식을 선택하세요: \uXXXX 또는 U+XXXX (인코딩 시에만 사용 가능)
- 결과가 자동으로 표시되며, 원클릭 복사 또는 입력/출력 교환이 가능합니다
인코딩 참고
- 유니코드 이스케이프 형식은 코드 및 디버깅에 유용하지만 일반 문구의 가독성을 떨어뜨릴 수 있습니다.
- 디코딩 시 서로게이트 쌍과 이모지 출력을 확인하세요. 쌍을 분리하면 깨진 문자가 생성될 수 있습니다.
활용 사례
기술 원리
Unicode 표준(ISO/IEC 10646)은 17개 플레인(U+0000~U+10FFFF)에 걸쳐 모든 문자에 고유한 숫자 코드포인트를 부여합니다. 기본 다국어 플레인(BMP, 플레인 0)은 U+0000~U+FFFF를 포함하며, CJK 통합 한자를 포함한 거의 모든 현대 문자 체계를 다룹니다. 보충 플레인(1~16)은 역사적 문자, 희귀 CJK, 이모지, 특수 목적 문자를 포함합니다. 이 도구는 읽을 수 있는 텍스트와 두 가지 기계 지향 표현(JavaScript 스타일 \uXXXX 이스케이프 시퀀스와 표준 U+XXXX 표기법) 간의 변환을 수행합니다. UTF-16은 JavaScript 문자열의 내부 인코딩입니다. BMP 문자는 코드포인트와 동일한 단일 16비트 코드 유닛으로 저장되며, 보충 문자(U+10000 이상)는 서로게이트 쌍으로 인코딩됩니다: 코드포인트에서 0x10000을 빼서 20비트 값을 남기고, 이를 10비트 상위 서로게이트(0xD800 + ((cp - 0x10000) >> 10))와 10비트 하위 서로게이트(0xDC00 + ((cp - 0x10000) & 0x3FF))로 분할합니다. 도구의 인코드 모드는 String.prototype.codePointAt()으로 보충 코드포인트를 감지하고 \uXXXX 형식에 대해 올바른 두 \u 이스케이프를 생성합니다. U+XXXX 형식의 경우 전체 코드포인트가 직접 표시됩니다. 디코드 모드는 세 가지 구문을 파싱합니다: \uXXXX(4자리 16진수, BMP만), \u{XXXXX}(전체 Unicode 범위를 지원하는 ES6 중괄호 구문), U+XXXX(가변 길이 16진수의 표준 표기법). 정규식 /\\u\{([0-9a-fA-F]+)\}/g는 중괄호 이스케이프를 처리하여 String.fromCodePoint()에 전달하고, /\\u([0-9a-fA-F]{4})/g는 String.fromCharCode()를 통해 전통적 이스케이프를 처리합니다. 두 가지를 혼합하면 보충 문자가 두 \u 이스케이프로 인코딩된 경우 서로게이트 쌍을 올바르게 재구성합니다. UTF-8 인코딩은 바이트 길이를 결정하므로 관련이 있습니다: '中'(U+4E2D) 같은 BMP 문자는 3 UTF-8 바이트(E4 B8 AD)로 인코딩되고, '😀'(U+1F600) 같은 이모지는 4바이트(F0 9F 98 80)가 필요합니다. 도구의 문자 카운터는 코드포인트 수와 UTF-16 코드 유닛 수를 구분합니다. 이는 데이터베이스, API, 폼 필드에서 문자가 아닌 코드 유닛을 기준으로 길이 제한을 디버깅할 때 유용한 구분입니다.
- 코드포인트 반복: String.prototype.codePointAt(pos)는 보충 문자에 대해 전체 코드포인트를 올바르게 반환하며, charCodeAt()는 상위 서로게이트만 반환 — 도구는 전개 연산자 [...str]를 사용하여 코드포인트 단위로 반복(내부적으로 문자열 이터레이터 프로토콜 호출)
- 서로게이트 쌍 연산: 보충 코드포인트 CP > 0xFFFF에 대해 상위 서로게이트는 Math.floor((CP - 0x10000) / 0x400) + 0xD800, 하위 서로게이트는 ((CP - 0x10000) % 0x400) + 0xDC00 — 인코드 모드는 이 공식을 적용하여 유효한 \uD800\uDC00 쌍을 생성
- 디코드 정규식 파이프라인: 세 패턴이 순차 실행 — \u{XXXXX}(ES6 중괄호) → \uXXXX(4자리 16진수) → U+XXXX(표준 표기법) — fromCodePoint()는 중괄호와 U+ 경로를, fromCharCode()는 전통적 4자리 경로를 처리
- UTF-8 바이트 구조: BMP 문자는 1~3 UTF-8 바이트 사용(ASCII = 1바이트, Latin 보충 = 2바이트, CJK = 3바이트); 보충 문자는 4바이트 사용(11110xxx 10xxxxxx 10xxxxxx 10xxxxxx 패턴) — 도구의 바이트 카운터는 new Blob([str]).size로 정확한 측정 수행
- 코드포인트 vs 코드 유닛: 단일 가시 문자가 여러 코드포인트를 차지할 수 있음(예: é는 U+00E9 또는 U+0065 + U+0301 결합 악센트 가능) — 도구는 charCount(UTF-16 코드 유닛)와 codepointCount(Unicode 스칼라 값)를 모두 보고하여 이 불일치를 표면화
- Unicode 플레인 개요: 플레인 0(BMP) = 현대 문자, 플레인 1(SMP) = 역사적 + 이모지 + 수학, 플레인 2(SIP) = 희귀 CJK, 플레인 14(SSP) = 태그 + 변형 선택자, 플레인 15~16 = 사적 사용 — 인코드 모드는 codePointAt()를 통해 모든 플레인을 올바르게 처리
- \u vs U+ 표기법: \uXXXX는 JavaScript/Java/C 이스케이프 시퀀스(중괄호 없이는 BMP만); U+XXXX는 Unicode 컨소시엄의 정식 표기법(최소 4자리 16진수, 상한 없음) — 도구의 형식 전환은 이 두 표현 간에 전환
예시
한자(중국어)를 Unicode 이스케이프로 변환
입력: 你好世界 (CJK 4자, UTF-8 12바이트)
출력: \u4f60\u597d\u4e16\u754c
참고: BMP 코드 포인트만 해당; JSON 문자열, JavaScript 리터럴, 로그 파일에 유용이모지를 서로게이트 페어로 이스케이프
입력: 😀🎉 (이모지 2개, 각각 U+FFFF 초과)
출력: \uD83D\uDE00\uD83C\uDF89
참고: 비-BMP 문자는 UTF-16 서로게이트 페어로 인코딩되며, 구형 JS 엔진에서는 왕복 변환에 String.fromCodePoint가 필요Unicode 이스케이프 디코딩
입력: \u4e2d\u6587\u6d4b\u8bd5
출력: 中文测试
참고: 이스케이프된 문자열을 붙여넣으면 도구가 인코딩을 역으로 풀어줍니다. CJK 페이로드 문제를 디버깅할 때는 출력 바이트가 원본과 일치하는지 확인하세요자주 묻는 질문
이 도구는 각 문자에 대해 무엇을 보여주나요?
코드 포인트(10진수와 16진수), 블록 이름(예: Basic Latin, CJK Unified Ideographs), 카테고리(Letter, Number, Symbol, Punctuation 등), Unicode 이름, 그리고 UTF-8 / UTF-16 / UTF-32 바이트 표현을 보여줍니다. 인코딩 버그 디버깅과 적절한 문자 선택에 유용합니다.
UTF-8, UTF-16, UTF-32의 차이는?
셋 다 동일한 Unicode 문자를 인코딩합니다. UTF-8은 코드 포인트당 1~4바이트를 사용하며 ASCII와 바이트 호환됩니다(웹의 지배적 인코딩). UTF-16은 2바이트나 4바이트를 사용합니다(JavaScript와 Windows 내부에서 사용). UTF-32는 항상 4바이트를 사용합니다(전송에서는 거의 보이지 않고, 메모리에서 흔합니다).
왜 '𝓗'가 두 개의 UTF-16 코드 단위로 표시되나요?
U+FFFF(Basic Multilingual Plane) 위의 코드 포인트는 UTF-16에서 '서로게이트 쌍'으로 인코딩됩니다: 두 개의 16비트 절반으로 표현됩니다. JavaScript의 string.length는 이를 2로 카운트하고, Array.from(str)은 하나로 처리합니다. 페이지는 두 시각을 모두 보여주므로 길이 카운트의 의외성을 디버그할 수 있습니다.
정규화 형식(NFC/NFD/NFKC/NFKD)이란 무엇인가요?
Unicode는 동일하게 보이는 텍스트의 여러 표현을 허용합니다 — é는 단일 코드 포인트(U+00E9)일 수도, e + 결합 어큐트 액센트(U+0065 U+0301)일 수도 있습니다. NFC는 합성하고, NFD는 분해합니다. NFKC/NFKD는 추가로 호환성 문자를 접습니다(½ → 1/2). 문자열 비교나 해싱 전에 항상 정규화하세요.
왜 이모지가 가끔 네모로 표시되나요?
브라우저의 폰트에 해당 글리프가 없기 때문입니다. 최신 이모지는 ZWJ 시퀀스(예: 👨👩👧 = 남자 + ZWJ + 여자 + ZWJ + 여자아이)를 사용하며, 단일 이미지로 렌더링하려면 특정 폰트가 필요합니다. 오래된 폰트는 이를 세 개의 별개 이모지나 네모로 표시합니다.
이름으로 문자를 어떻게 찾나요?
검색 상자에 이름(또는 일부)을 입력하세요. 이름은 공식 Unicode 이름 목록(LATIN SMALL LETTER A, GREEK CAPITAL LETTER OMEGA, MUSICAL SYMBOL G CLEF)을 따릅니다. 일반적인 이모지는 페이지가 인식하는 'CLDR short name'도 가지고 있습니다.
입력 내용이 업로드되나요?
아니요. 조회는 브라우저 내 Unicode 데이터베이스를 사용합니다. 어떤 데이터도 업로드되지 않습니다.