코딩, 개발에 대한 기록 저장소

맥에서 업로드한 한글 파일을 linux 파일에서 못 읽는 이유

다음의 "한"과 "한"은 시각적으로는 동일해 보이지만, 내부적으로는 다른 Unicode 인코딩을 사용하여 표현됨.

"한" (U+D55C):

이는 단일 유니코드 문자로, "한"의 조합을 하나의 문자로 결합한 것
유니코드 값: U+D55C
UTF-8 인코딩: E D5 9C

"한" (U+1112 U+1161 U+11AB):

이는 세 개의 개별 유니코드 문자로 구성된 조합형 문자
ᄒ (초성): U+1112
ᅡ (중성): U+1161
ᆫ (종성): U+11AB
UTF-8 인코딩: 각각 E1 84 92, E1 85 A1, E1 86 AB로 인코딩됨

문제 해결

이 차이는 Unicode 정규화(Normalization)를 통해 해결할 수 있음.

  • NFC (Normalization Form C): 조합형 문자들을 가능한 한 결합하여 하나의 문자로 만듦
  • NFD (Normalization Form D): 조합형 문자들을 가능한 한 분해하여 각각의 구성 요소로 나눔

아래 예제 코드 참고

import unicodedata

# 조합형 문자
composed = '한'
# 분해된 문자
decomposed = '한'

# NFC 정규화
composed_nfc = unicodedata.normalize('NFC', decomposed)
# NFD 정규화
decomposed_nfd = unicodedata.normalize('NFD', composed)

print(f"Composed: {composed}, NFC: {composed_nfc}")
print(f"Decomposed: {decomposed}, NFD: {decomposed_nfd}")

# 출력 결과
# Composed: 한, NFC: 한
# Decomposed: 한, NFD: 한