liminfo

문자 인코딩 레퍼런스

UTF-8, ASCII, EUC-KR, Base64 등 문자 인코딩 방식 총정리

28개 결과

문자 인코딩 레퍼런스 소개

문자 인코딩 레퍼런스는 현대 소프트웨어에서 사용되는 텍스트 인코딩 표준 전반을 다루는 개발자 중심의 치트 시트입니다. UTF-8 바이트 구조, ASCII 제어 문자, EUC-KR/CP949 한글 인코딩, Base64 및 Base64url 방식, URL 퍼센트 인코딩 규칙, 유니코드 코드 포인트에 대한 상세 항목을 포함하며, 각 항목에는 Python, JavaScript, 셸 명령어로 작성된 실행 가능한 코드 예제가 제공됩니다.

이 레퍼런스는 인코딩 문제를 자주 다루는 웹 개발자, 백엔드 엔지니어, 보안 연구자, 데이터 과학자가 활용합니다. 깨진 한글 복구, JWT 토큰 구성, Data URI 이미지 임베딩, 국제화 도메인(IDN/Punycode) 처리 등 실무에서 바로 쓸 수 있는 코드 스니펫으로 구성되어 있습니다.

레퍼런스는 6가지 주요 인코딩 범주로 구성됩니다: UTF-8(가변 길이 유니코드, BOM 처리, 서로게이트 검증), ASCII(7비트 문자표, 제어 코드, 대소문자 비트 연산), EUC-KR/CP949(한글 레거시 인코딩, iconv 변환, 깨진 문자 복구), Base64/Base32(인코딩 원리, Data URI, TOTP 시크릿), URL 인코딩(퍼센트 인코딩, encodeURIComponent vs encodeURI, 폼 인코딩), 유니코드(평면 구조, NFC/NFD 정규화, 서로게이트 쌍, 이스케이프 표기).

주요 기능

  • 1~4바이트 UTF-8 시퀀스의 이진 비트 패턴과 바이트 구조 표
  • ASCII 제어 문자(NUL, LF, CR, ESC, DEL)와 출력 가능 문자 범위
  • EUC-KR vs CP949 비교 — 2,350자 vs 11,172자 한글 음절 지원 차이
  • Base64 인코딩 원리, Base64url(JWT 안전), Data URI 형식, TOTP용 Base32
  • Python urllib와 JavaScript encodeURIComponent 예제가 포함된 URL 퍼센트 인코딩 규칙
  • 유니코드 0~16번 평면 개요, NFC/NFD 정규화, 서로게이트 쌍 계산
  • Python(iconv, codecs)과 Linux 셸용 인코딩 변환 코드 스니펫
  • 잘못된 인코딩으로 깨진 텍스트 복구 방법

자주 묻는 질문

UTF-8과 UTF-16의 차이는 무엇인가요?

UTF-8은 문자당 1~4바이트 가변 길이를 사용하며 ASCII 문자가 많은 텍스트에 공간 효율적이고 웹에서 지배적인 인코딩입니다. UTF-16은 대부분의 문자(한국어, 중국어, 일본어 포함)에 2바이트를 사용하고 BMP 외부 문자에는 4바이트를 사용합니다. 파일, API, 웹 콘텐츠에는 UTF-8을, JavaScript/Java/Windows API의 내부 처리에는 UTF-16이 사용됩니다.

한글이 깨져 보이는 이유는 무엇인가요?

한글 깨짐(모지바케)은 텍스트를 잘못된 인코딩으로 읽을 때 발생합니다. UTF-8 파일을 EUC-KR로 열거나 CP949 파일을 Latin-1으로 디코딩하면 바이트 값이 잘못된 문자에 매핑됩니다. 원시 바이트를 올바른 코덱으로 다시 인코딩하면 복구할 수 있습니다. 이 레퍼런스에는 EUC-KR 또는 Latin-1로 잘못 읽힌 텍스트를 복구하는 Python 코드가 포함되어 있습니다.

EUC-KR과 CP949의 차이는 무엇인가요?

EUC-KR(KS X 1001)은 문자당 2바이트를 사용하는 한글 레거시 표준 인코딩으로 2,350개의 완성형 한글 음절을 지원합니다. CP949(MS949)는 Microsoft가 EUC-KR을 확장한 인코딩으로 첫 바이트 범위를 0x81~0xFE로 확장해 현대 한글 11,172자 전체를 지원합니다. 현대 시스템은 UTF-8을 사용해야 하며, CP949는 레거시 Windows 파일에서 여전히 관련이 있습니다.

Base64url은 언제 사용해야 하나요?

표준 Base64는 URL이나 파일명에서 안전하지 않은 + 와 / 문자를 사용합니다. Base64url은 +를 -로, /를 _로 대체하며 패딩(=)을 선택적으로 만듭니다. JWT, OAuth 토큰, URL 쿼리 파라미터, 파일명에 데이터를 인코딩할 때는 Base64url을 사용하세요. Python의 base64.urlsafe_b64encode()가 이를 자동으로 처리합니다.

encodeURI와 encodeURIComponent의 차이는 무엇인가요?

encodeURI는 URL 전체를 인코딩하도록 설계되어 : / ? # & = 같은 URL 구조적 문자를 보존합니다. encodeURIComponent는 문자, 숫자, - _ . ! ~ * ' ( )를 제외한 모든 것을 인코딩하여 개별 쿼리 파라미터 값이나 경로 세그먼트 인코딩에 안전합니다. 사용자 입력값을 인코딩할 때는 항상 encodeURIComponent를 사용하세요.

유니코드 정규화 형식 NFC와 NFD란 무엇인가요?

유니코드에서는 일부 문자를 여러 방식으로 표현할 수 있습니다. 한글 "가"는 단일 코드 포인트 U+AC00(NFC, 완성형)으로 저장하거나 두 개의 코드 포인트 ㄱ(U+1100) + ㅏ(U+1161)(NFD, 분해형)으로 저장할 수 있습니다. NFC는 저장과 전송에 적합하고 선호되는 형식이며, NFD는 macOS 파일명과 일부 레거시 시스템에서 사용됩니다. 문자열 비교 전에 반드시 동일한 형식으로 정규화해야 합니다.

서로게이트 쌍이란 무엇이고 언제 발생하나요?

UTF-16은 U+FFFF를 초과하는 코드 포인트(이모지, 희귀 CJK 문자 등 BMP 외부 문자)를 서로게이트 쌍이라는 두 개의 16비트 코드 유닛으로 표현합니다. 상위 서로게이트는 0xD800~0xDBFF, 하위 서로게이트는 0xDC00~0xDFFF 범위입니다. JavaScript 문자열은 내부적으로 UTF-16을 사용하므로 😀 같은 이모지는 문자열에서 2개의 위치를 차지하며 올바른 처리를 위해 charCodeAt() 대신 codePointAt()을 사용해야 합니다.

국제화 도메인(IDN)의 Punycode 인코딩은 어떻게 작동하나요?

국제화 도메인 이름(IDN)은 도메인 이름에 비ASCII 문자를 허용하지만 DNS 시스템은 ASCII만 지원합니다. Punycode는 유니코드 레이블을 xn-- 접두어로 시작하는 ASCII 호환 인코딩(ACE)으로 변환합니다. 예를 들어 "한글.kr"은 "xn--bj0bj06e.kr"이 됩니다. Python의 str.encode("idna")로 변환할 수 있습니다. 시각적으로 유사한 유니코드 문자가 호모그래프 피싱 공격에 악용될 수 있으므로 브라우저는 의심스러운 도메인의 경우 punycode 형식을 표시합니다.