유니코드 가이드 · 2026년 10월 20일 업데이트
Python에서 유니코드 다루기
처리하는 동안 텍스트는 str로 유지하세요. 저장이나 전송 시 bytes로 인코딩하고 알고 있는 원본 인코딩으로 디코딩하세요. 아래 예제를 Python 3에서 실행하세요.
ord()와 chr()로 코드 포인트 확인
Python 3의 str은 유니코드 텍스트입니다. ord()는 코드 포인트 하나를 정수로 바꾸고 chr()는 반대로 동작합니다. 하나로 보이는 이모지도 여러 코드 포인트를 포함할 수 있습니다.
text = "Aé♥"
print([f"U+{ord(char):04X}" for char in text])
# ['U+0041', 'U+00E9', 'U+2665']
print(chr(0x2665))
# ♥UTF-8로 문자열 인코딩 및 바이트 디코딩
encode()는 텍스트를 바이트로, decode()는 바이트를 텍스트로 바꿉니다. 원본의 실제 인코딩을 사용하세요. 잘못된 입력은 기본적으로 오류를 일으킵니다.
text = "café"
data = text.encode("utf-8")
print(data.hex(" "))
# 63 61 66 c3 a9
print(data.decode("utf-8"))
# café
assert data.decode("utf-8") == text이스케이프 표기와 실제 문자 구분
일반 Python 문자열 리터럴에서는 유니코드 이스케이프를 해석합니다. raw 문자열은 역슬래시를 유지합니다. 표현에 이스케이프가 보여도 저장된 텍스트에 역슬래시가 있다는 뜻은 아닙니다.
heart = "\u2665"
literal = r"\u2665"
print(heart, len(heart))
# ♥ 1
print(literal, len(literal))
# \u2665 6
assert heart == "♥"비교 전에 동등한 텍스트 정규화
미리 조합된 문자와 문자에 결합 기호를 붙인 형태가 같아 보일 수 있습니다. NFC는 정준적으로 동등한 문자열을 맞춥니다. 번역하거나 악센트를 없애는 작업이 아닙니다.
import unicodedata
composed = "é"
decomposed = "e\u0301"
print(composed == decomposed)
# False
print(unicodedata.normalize("NFC", decomposed) == composed)
# True흔한 인코딩 실수 피하기
- UTF-8 파일에는 encoding="utf-8"을 지정하고 오래된 문서는 원본 인코딩을 확인하세요.
- errors="ignore"를 일반적인 복구 방법으로 쓰지 마세요. 알리지 않고 데이터를 버립니다. 오류를 명시적으로 처리하세요.
- len()은 str의 코드 포인트 수를 세며 보이는 글자 수가 아닙니다. 결합 기호와 이모지는 여러 코드 포인트를 포함할 수 있습니다.
- ASCII는 모든 유니코드를 인코딩할 수 없습니다. 대체나 음역은 내용을 바꿉니다.