언어·프레임워크/Python

[Python] 파이썬, 한글 파일명 자모 분리? 걱정 노노!

DandyNow 2025. 4. 17. 13:47
728x90
반응형

파이썬, 한글 파일명 자모 분리? 걱정 노노!

파이썬으로 파일을 다루다 보면, 특히 macOS 환경에서 한글로 된 파일명이 'ㅎㅏㄴㄱㅡㄹ'처럼 자음과 모음이 따로 떨어져 보이는 당황스러운 경험을 할 수 있다. 분명 '한글'이라고 저장했는데 왜 이렇게 보이는 걸까? 이 현상은 생각보다 흔하며, 다행히 간단한 해결 방법이 있다.

1. 왜 이런 문제가 발생할까? (유니코드 정규화)

이 문제의 핵심에는 유니코드 정규화(Unicode Normalization) 방식의 차이가 있다.

  • 같은 글자, 다른 표현: 컴퓨터는 글자를 유니코드라는 표준 방식으로 다루는데, 놀랍게도 '한'이라는 하나의 한글 글자를 표현하는 방식이 여러 가지일 수 있다.
  • NFC (표준 조합): 우리가 흔히 생각하는 방식이다. '한'이라는 글자를 하나의 완성된 코드 값으로 인식한다. 대부분의 운영체제(Windows, Linux)와 웹 환경에서 이 방식을 선호한다.
  • NFD (표준 분해): 글자를 구성 요소로 분해해서 인식한다. '한'을 'ㅎ' + 'ㅏ' + 'ㄴ' 이라는 자음과 모음의 조합으로 본다. macOS의 파일 시스템(APFS, HFS+)이 내부적으로 이 방식을 주로 사용한다.
  • 문제의 시작: macOS에서 NFD 방식으로 저장된 파일명을 파이썬 코드가 그대로 읽거나, NFC 방식을 기대하는 다른 프로그램이나 시스템(예: 윈도우 PC, 서버)으로 파일을 옮기면, NFD 방식의 자모 조합이 그대로 노출되어 글자가 깨져 보이는 것이다.

2. 해결책: unicodedata 모듈로 깔끔하게!

파이썬은 이런 문제를 해결할 수 있도록 unicodedata라는 강력한 내장 모듈을 제공한다. 해결 방법은 간단하다. 파일명을 사용하기 전에 NFC 방식으로 통일시켜주는 것이다.

  • 핵심 함수: unicodedata.normalize(form, unistr)

    • form 인자에는 'NFC' (우리가 원하는 방식) 또는 'NFD' 등을 지정한다.
    • unistr 인자에는 정규화할 파일명 문자열을 넣는다.
  • 사용법: 자모 분리가 의심되는 파일명(특히 macOS에서 생성/관리되는)을 unicodedata.normalize('NFC', 파일명)으로 감싸주면 된다.

  • 예시 코드:

    import unicodedata
    import os
    
    # macOS에서 os.listdir() 등으로 읽어온 파일명이라고 가정 (NFD 형태일 수 있음)
    # 직접 테스트를 위해 NFD 형태를 만들어보자.
    original_filename = '한글파일명.txt'
    filename_potentially_nfd = unicodedata.normalize('NFD', original_filename)
    
    print(f"처리 전 파일명 (NFD 가정): {filename_potentially_nfd}") # 출력: ㅎㅏㄴㄱㅡㄹㅍㅏㅇㅣㄹㅁㅕㅇ.txt (터미널 환경에 따라 다르게 보일 수 있음)
    
    # NFC 방식으로 정규화
    filename_nfc = unicodedata.normalize('NFC', filename_potentially_nfd)
    print(f"NFC로 정규화 후: {filename_nfc}") # 출력: 한글파일명.txt
    
    # 이제 정규화된 이름(filename_nfc)으로 파일 관련 작업 수행
    try:
        # 파일을 생성하거나 열 때 정규화된 이름을 사용한다.
        with open(filename_nfc, 'w', encoding='utf-8') as f:
            f.write("이 파일은 NFC 방식으로 저장되었습니다.")
        print(f"'{filename_nfc}' 이름으로 파일 생성/저장 완료!")
    
        # 파일 존재 여부 확인 등 다른 작업에도 NFC 이름 사용
        if os.path.exists(filename_nfc):
            print(f"'{filename_nfc}' 파일 확인 완료!")
    
        # 사용 후 테스트 파일 삭제 (필요시)
        # os.remove(filename_nfc)
    
    except OSError as e:
        print(f"파일 처리 중 오류 발생: {e}")
  • 포인트: 파일을 저장(open(..., 'w'))하거나, 파일 경로를 다른 함수/라이브러리에 전달하기 전에 normalize('NFC', ...)를 적용하는 것이 중요하다.

3. 추가 팁 및 주의사항

이 문제를 해결할 때 몇 가지 더 알아두면 좋은 점들이 있다.

  • 플랫폼 간 호환성: macOS에서 만든 파일을 윈도우나 리눅스로 옮겨 사용할 때 이 정규화 처리는 거의 필수적이다. 파일 공유, Git 버전 관리, 서버 배포 등 다양한 상황에서 문제를 예방할 수 있다.
  • 파일 목록 읽어올 때: 파이썬의 os.listdir() 함수로 디렉토리의 파일 목록을 가져올 때, macOS 환경이라면 NFD 형식의 파일명이 반환될 수 있다. 따라서 목록의 각 파일명을 사용할 때도 NFC 정규화가 필요할 수 있다.
  • 외부 라이브러리: 사용하는 외부 라이브러리가 내부적으로 파일 경로를 어떻게 처리하는지 명확하지 않다면, 안전하게 NFC로 정규화된 경로를 전달하는 것이 좋다.

결론

파이썬에서 한글 파일명이 깨지는 현상은 당황스러울 수 있지만, 그 원인이 유니코드 정규화 방식의 차이에 있다는 것을 이해하면 해결은 간단하다. unicodedata.normalize('NFC', ...) 함수를 적절히 활용하여 파일명을 NFC 방식으로 통일해주면, 자모 분리 현상을 막고 여러 시스템 간의 호환성도 높일 수 있다.

728x90
반응형