시작배경
저는 회사에서 윈도우OS를 주로 사용하는데, 일할 때 개발자들과 소통하다 보면 맥OS에서 한글로 이름을 작성한 파일을 받는 일이 생겼었습니다. 해당 파일을 윈도우OS에서 다운로드하면 한글 자음과 모음이 분리돼서 나오는데 알아보기 어렵기도 하고 제가 파일을 찾기 쉽게, 보기 쉽게 정리하는 걸 좋아해서 가만히 두기가 어려웠습니다. 요즘은 구글링하면 무료로 OCR도 하고 이미지 배경도 삭제하는 시대이니 혹시 그런 사이트가 있는지 찾아봤지만 프로그램은 있는데 사이트는 없는 것 같더라구요. (저는 간헐적으로 사이트로 쓰고 싶었는데 저만 그랬나봐요... 😅)
여하튼 그래서 "내가 하나 만들어보자!"라는 생각으로 하나 만들어보았습니다. 이번 포스팅에서는 맥OS에서 한글로 이름을 작성한 파일을 윈도우OS에서 자음모음이 분리되지 않은 형태로 변환하는 기능을 만드는 과정을 소개해보고자 합니다.
제작 과정
전반적인 제작 과정은 ChatGPT의 도움을 받았습니다. (대화기록)
자소 분리 원인 파악하기
맥OS에서 한글로 이름을 작성한 파일에서 자음과 모음이 분리되어 보이는 현상은 왜 일어나는 걸까요? ChatGPT에게 물어보니 아래와 같이 답해주었습니다.
맥OS에서 파일 이름을 한국어로 저장할 때 자음과 모음이 분리되어 보이는 현상은 일반적으로 문자 인코딩 문제와 관련이 있습니다. 이는 특히 오래된 소프트웨어나 시스템, 혹은 다른 운영 체제와의 호환성 문제로 인해 발생할 수 있습니다.
한글은 유니코드를 사용하여 인코딩되는데, 유니코드에는 각 글자를 자음과 모음으로 분리하여 표현하는 방식(조합형)과 완성된 글자 자체를 하나의 단위로 표현하는 방식(완성형)이 있습니다. 대부분의 현대 시스템과 애플리케이션은 완성형을 사용하지만, 일부 시스템이나 애플리케이션은 이를 제대로 처리하지 못해 조합형으로 분리되어 보이는 현상이 발생할 수 있습니다.
또한, 맥OS와 다른 운영 체제 간의 파일 시스템 호환성 문제로 인해 이러한 인코딩 문제가 더욱 두드러질 수 있습니다. 예를 들어, NTFS(Windows 파일 시스템)와 HFS+(맥OS 파일 시스템) 사이에서 파일을 옮길 때, 인코딩 방식의 차이로 인해 한글이 제대로 표시되지 않는 경우가 있습니다. 이러한 문제를 해결하기 위해서는 사용 중인 시스템이나 소프트웨어의 업데이트를 확인하거나, 파일 이름에 한글을 사용할 때는 가능한 최신 버전의 소프트웨어와 운영 체제를 사용하는 것이 좋습니다. 또한, 파일을 다른 시스템으로 옮길 때는 인코딩 호환성을 고려하여 적절한 조치를 취하는 것이 중요합니다.
* 출처 : ChatGPT
구글링으로 더 찾아보니 윈도우OS는 NFC 방식을 사용하고 맥OS는 NFD 방식을 사용하기 때문이라고 하더라구요. 사실 이유는 저에겐 크게 중요하지 않았기 때문에 간단하게 개념만 한줄 요약하고 넘어가겠습니다. 관련 개념은 구글링하면 다른 분들께서 잘 설명해주신 글들이 많으니 해당 글을 참고하시면 좋을 것 같아요!
- NFC : 하나의 문자 단위로 저장한다. 각 → 각
- NFD : 모든 음절을 분해해 음정 단위로 저장한다. 각 → ㄱ+ㅏ+ㄱ
Python으로 자소 분리 수정 코드 작성하기 (unicodedata)
개념은 알았으니 그래서 이제 파일명을 수정하는 코드를 작성해봤습니다. ChatGPT에게 물어보니 'unicodedata'를 사용하면 된다고 하더라구요.
import os
import unicodedata
def normalize_filenames(directory):
# 디렉토리 내의 모든 파일과 디렉토리에 대해 반복
for filename in os.listdir(directory):
# 파일명을 NFC 형태로 정규화
normalized_name = unicodedata.normalize('NFC', filename)
# 원본 파일명과 정규화된 파일명이 다르다면, 파일명 변경
if filename != normalized_name:
original_path = os.path.join(directory, filename)
new_path = os.path.join(directory, normalized_name)
os.rename(original_path, new_path)
print(f"Renamed '{filename}' to '{normalized_name}'")
# 현재 작업 디렉토리 사용
current_directory = '.'
normalize_filenames(current_directory)
ChatGPT가 제시한 코드에서 unicodedata.normalize('NFC', filename)이 포인트였기에 해당 코드를 참고했습니다. 사이트로 배포하면 어떻게 쓰는 게 가장 편할지 고민하다가 파일 자체를 업로드해서 변환하는 방법을 채택했습니다. 파일을 업로드하면 확장자도 같이 가져오니 확장자를 빼고 변환하도록 아래와 같이 코드를 다시 작성했고 사이트 배포까지 작업했습니다.
def normalize_filename(filename, include_extension=True):
# 파일 이름과 확장자 분리
if "." in filename and include_extension:
name_part, extension_part = filename.rsplit(".", 1)
normalized_name = unicodedata.normalize('NFC', name_part) + "." + extension_part
else:
normalized_name = unicodedata.normalize('NFC', filename)
if not include_extension and "." in normalized_name:
normalized_name = normalized_name.rsplit(".", 1)[0]
return normalized_name
배포 결과
사이트 배포에는 streamlit을 사용했습니다.
맥OS 한글 파일명 자소 분리 수정 : A free online converter
This app was built in Streamlit! Check it out and visit https://streamlit.io for more awesome community apps. 🎈
super-son.streamlit.app
회고
만들고 배포까지 하고 보니 꽤 잘 만들어진 것 같습니다. 제가 만들었으니 저라도 아껴준다는 마음으로 사용할 상황이 되면 들어가서 자주 사용하게 될 것 같습니다.
Shout out to ChatGPT!
사실상 가장 중요한 부분들은 ChatGPT가 거의 해결해 준 것 같습니다. 만들고 싶은 게 있으면 바로 도움을 받아서 처리할 수 있으니 좋은 것 같아요. 저보다 잘할 때가 많아서 걱정도 되지만 그만큼 "잘 쓰는 사람이 되면 오히려 경쟁력이 있겠지."라는 생각도 듭니다. 이러니저러니 해도 결론은 ChatGPT 덕에 만들고 싶은 것들 만드는데 드는 리소스나 시간이 줄어들어 좋다!