-
파이썬으로 맥에서 깨진 한글 파일명 복구개발 환경/Mac 2020. 5. 15. 14:39반응형
네이버 메일에서 첨부파일을 다운 받았는데 파일명이 전부 깨져버렸다... 물론 그냥 들어가서 내용을 보면 파일명을 유추할 수 있고 문서를 읽는데는 아무런 문제가 없지만, 개발자의 욕심? 끈기?를 이용해 복구하는데에 성공했다.
0. 나의 환경
- OS: macOS Catalina 10.15.4
- 상대방 OS: windows (추정)
- 브라우저: 사파리 (크롬으로 했을때도 깨진 상태로 받아진다.)
- 네이버 메일
1. NFC vs NFD?
이리저리 찾다보니 알게된 사실이다. Unicode를 정규화하는 방법이 있는데 맥과 윈도우는 그 방법이 서로 다르다.
- 맥: NFD (Normalization Form Canonical Decomposition)
- 윈도우: NFC (Normalization Form Canonical Composition)
자세한 것은 ko.wikipedia.org/wiki/유니코드_정규화를 참고하자.
여튼 메일을 보낸 사람은 윈도우로 추정하고 나는 맥을 사용중이었다. 윈도우에서 만든 파일명이 NFC로 노말라이즈 되어있는데 나는 맥에서 NFD로 노말라이즈를 하며 파일을 다운로드 했으므로 문자열이 깨졌을 것이다.
filename_mac = "ºÙÀÓ1. 2020³â SW¸¶¿¡½ºÆ®·Î°úÁ¤ Á¦11±â ¿¬¼ö»ý Á¦Ãâ¼·ù ¾È³»"
x먼저 파인더에서 파일명을 그대로 복사해 변수로 선언해줬다.
print(len(filename_mac))
output:
74
노말라이즈 방법을 바꿔서 적용해주자.
from unicodedata import normalize filename_nfc = normalize('NFC', filename_mac) print(len(filename_nfc))
output:
58
같은 문자열이지만 노말라이즈 방법에 따라 길이가 달라진다.
2. Encoding and Decoding
문자열의 세계는 너무 복잡하다. 방금까지 파이썬에서 사용하던 문자열은 unicode였고, 이제 이것을 ISO-8859-1로 encoding한후 다시 cp949로 decoding해줘야 한다.
filename_cp949 = filename_nfc.encode('ISO-8859-1').decode('cp949') print(filename_cp949)
output:
'붙임1. 2020년 SW마에스트로과정 제11기 연수생 제출서류 안내'
잘 복구가 되었다. 문자열에 무슨 인코딩 방식이 사용됐는지 알아보기는 쉽지 않다(노가다). 하지만 계속 도전하다보면 원래 한글대로 복구 할 수 있을 것이다.
3. 전체 코드
from unicodedata import normalize filename_mac = "ºÙÀÓ1. 2020³â SW¸¶¿¡½ºÆ®·Î°úÁ¤ Á¦11±â ¿¬¼ö»ý Á¦Ãâ¼·ù ¾È³»" filename_nfc = normalize('NFC', filename_mac) filename_cp949 = filename_nfc.encode('ISO-8859-1').decode('cp949') print(filename_cp949)
출처:
zelkun.tistory.com/entry/JSPSERVLETSPRING-한글파일-다운로드-파일명-처리
wodonggun.github.io/wodonggun.github.io/study/한글-인코딩이란.html
www.digipine.com/index.php?mid=programming&document_srl=26735
반응형'개발 환경 > Mac' 카테고리의 다른 글
Mac에서 한글 인코딩 다 깨졌을 때 모든 파일 변경하기 (find, read, iconv) (3) 2020.03.16 Mac에 ms office 2019 설치 (영어, 한글 가능) (104) 2020.02.03 맥북과 구형 모니터나 TV 연결시 YCbCr (분홍색 화면)으로 나오는 경우 해결방법 [2020.1.10 해결, Catalina 10.15.2] (4) 2020.01.10