작성일: / 수정일:

유니코드 NFD 문자열을 NFC 문자열로 변환하는 방법을 Python 스크립트와 nfd2c 툴을 활용하여 설명합니다.
이 글은 macOS 및 다양한 운영 체제에서 유니코드 호환성을 유지하기 위해 NFD와 NFC 간 변환이 필요한 상황에 유용합니다.

NFD와 NFC

유니코드는 다양한 언어와 문자를 일관되게 표현하기 위한 국제 표준입니다. 하지만 동일한 문자라도 운영 체제나 시스템에 따라 다른 유니코드 정규화 방식(NFD, NFC)으로 저장되거나 처리될 수 있습니다.
이는 파일 시스템, 데이터베이스, 문자열 비교 등에서 예상치 못한 문제를 일으킬 수 있습니다.

유니코드 정규화 방식

  1. NFD (Normalization Form Decomposition)
    • 문자 분해 방식: 기본 문자와 결합 문자(음절)를 별도로 분리해 표현합니다.
    • 특징:
      • 일부 시스템에서 호환성 문제가 발생할 수 있습니다.
        (예: macOS의 파일 시스템은 NFD 형식을 기본으로 사용)
      • 같은 문자열이지만, 서로 다른 형식으로 인식되어 비교나 검색이 실패할 가능성이 있습니다.
      • 저장 공간을 더 많이 사용합니다.
      • 시각적으로는 동일해 보이지만 내부적으로 다른 표현을 가집니다.
    • 예시:
      • NFD: (문자 a + 결합 문자 ¯)
  2. NFC (Normalization Form Canonical Composition)
    • 문자 합성 방식: 가능한 경우 기본 문자와 결합 문자를 단일 문자로 합성합니다.
    • 특징:
      • 대부분의 시스템에서 더 높은 호환성을 제공합니다.
        (Windows, Android 등은 NFC 형식을 기본으로 사용)
      • 문자열 비교 및 검색이 용이합니다.
      • 저장 공간을 절약할 수 있습니다.
    • 예시:
      • NFC: ā (단일 문자 ā)

NFD와 NFC의 필요성

  • 운영 체제 간 호환성: macOS와 Windows/Android 간 파일 이름 불일치 문제를 해결합니다.
  • 데이터 정합성 유지: 데이터베이스나 텍스트 파일의 문자열 비교 결과를 일관되게 만듭니다.

Python 스크립트로 변환하기

Python의 unicodedata.normalize 함수를 사용하면 NFD 문자열을 쉽게 NFC 문자열로 변환할 수 있습니다.
아래는 간단한 변환 예제입니다.

import unicodedata

def nfd_to_nfc(text):
    """NFD 문자열을 NFC 문자열로 변환합니다."""
    return unicodedata.normalize('NFC', text)

# 테스트 문자열 (예: macOS에서 NFD로 저장된 문자열)
text = "Amēricā"
nfc_text = nfd_to_nfc(text)

print(f"원본 텍스트: {text}")  # 출력: 원본 텍스트 (NFD)
print(f"변환된 텍스트: {nfc_text}")  # 출력: America

주요 함수 설명

  • unicodedata.normalize(form, text)
    • form: 변환할 정규화 방식 (예: 'NFC', 'NFD', 'NFKC', 'NFKD')
    • text: 변환할 문자열
  • 유용한 활용 예시:
    • 텍스트 데이터 전처리
    • 운영 체제 간 파일 이름 호환성 유지
    • 검색 기능 강화 (정규화된 형태로 통합)

nfd2c 툴 사용하기

파일 및 디렉토리 이름의 NFD 문자열을 NFC 문자열로 변환하려면 nfd2c 툴이 유용합니다.
특히 macOS와 Windows 간 파일 시스템 호환성 문제를 해결하는 데 효과적입니다.

설치 및 기본 사용법

$ pip install unicode-nfd2c

사용법 예시

# 현재 디렉토리의 파일 이름을 NFC 형식으로 변환
$ nfd2c

# 모든 서브 디렉토리를 포함해 변환 실행
$ nfd2c -r

# 변환 실행 (파일 이름 변경)
$ nfd2c -x

# 특정 파일만 변환
$ nfd2c -f myfile.txt

옵션 설명

  • -x, --execute: 실제 이름 변경 실행
  • -r, --recursive: 서브 디렉토리 포함
  • -d, --dir-only: 디렉토리 이름만 변환
  • -f, --file-only: 파일 이름만 변환
  • -h, --help: 도움말 표시

변환 전후 확인

$ nfd2c
Found NFD filename: "Amēricā.txt"
Would convert to: "America.txt"

실제 변환을 실행하려면 -x 옵션을 추가합니다.


마무리

NFD와 NFC 변환은 운영 체제 간 호환성과 데이터 정합성을 유지하는 데 필수적입니다.

  • Pythonunicodedata 모듈은 텍스트 기반 데이터에 유용합니다.
  • nfd2c 툴은 파일 및 디렉토리 이름을 변환하는 데 효율적입니다.

이 글에서 제공한 방법을 통해 유니코드 문자열 처리 문제를 해결하고 시스템 간 호환성을 확보하세요. 😊


댓글남기기