2018년 12월 26일 수요일

여기에 압축 풀기 기능에서 한글 파일 깨짐

zip 압축파일에 한글 파일명이 포함되어 있을 때 zip -F 명령을 거치는 방법은 예전에 봤었고, unzip -O cp949 식으로 옵션을 줄 수 있는 건 새로 알았다.

그놈 기본 파일 관리자인 노틸러스를 그냥 쓰고 있는데, 압축파일을 우클릭하면 나오는 "여기에 압축 풀기" 항목으로는 여전히 한글이 깨진 채로 압축이 풀린다. 이 기능을 쓰면 얼마 전까지도 file-roller 창이 그냥 떴던 것 같은데 언젠가부터 노틸러스 창 안쪽에 동그라미로 진행률이 표시되다가 끝나는 방식으로 바뀌었다. 그래서 아마 nautilus 자체 기능으로 뭔가 들어갔겠거니 싶어서 찾아보았다.

apt source nautilus 명령으로소스를 받아온 다음 grep Extract Here -ri로 전체를 찾아보았다. nautilus-files-view.c 파일에 이것저것 있다. extract_here로도 찾아보니 action_extract_here, extract_files 같은 그럴듯한 함수들이 나온다. 타고 들어가보면 nautilus_file_operations_extract_files 함수가 노틸러스에 진행률이 표시되도록 연결하는 부분이고 마지막에 언급되는 extract_task_thread_func라는 함수가 실제로 압축 해제를 진행한다.

압축 해제 기능은 gnome-autoar 패키지에 의존한다. libgnome-autoar-0-0 패키지가 있고, apt remove 시도해보니 nautilus 패키지도 같이 제거될 거라고 나온다. https://github.com/GNOME/gnome-autoar/tree/master/gnome-autoar 여기에 소스가 있다.

autoar_extractor_do_sanitize_pathname 함수를 거쳐 autoar_common_get_utf8_pathname 함수를 보면 UTF-8 파일명이 아닌 경우에 3가지 인코딩을 하드코딩해두고 차례로 변환을 시도한다. 이 과정에서 EUC-KR 한글 파일명이 깨진 문자열로 바뀌는 걸 텐데, 현재 소스코드에서는 환경변수를 참조하는 등의 열린 구조가 아니어서 바로 해결은 안 되겠다. G_FILENAME_ENCODING 같은 게 아직 쓰이나 모르겠네.