유니코드가 없던 시대의 파일 포맷이 사람을 괴롭게 하는 또 하나의 사례로 zip 이 있다. 윈도우에서 한글 파일명을 갖는 파일을 압축하면 euc-kr 을 써버리는데, 우분투에 따라나오는 데비안 unzip 은 이거를 무조건 utf-8 이라고 생각하고 디스크에 써버린다. 사람들이 패치도 만들어서 보냈지만 메인테이너가 'ㅈㄲ' 라고 버티는 바람에 사람들은 21세기인 지금까지도 패치본 만들어서 깔고, 서드파티 jar 받아다 푸는 역경을 이겨내고 있다.... 아 눈물이....
그래서 파이썬으로 짜보았습니다.
lang:py
#!/usr/bin/python
# -*- coding: utf-8 -*-
import os
import sys
import getopt
import zipfile
def decompress(zf, enc):
for info in zf.infolist():
utf8_name = info.orig_filename.decode(enc)
segments = utf8_name.split("/")
if len(segments) > 1:
try:
os.makedirs("/".join(segments[:-1]))
except OSError:
pass
print utf8_name
open(utf8_name, "w").write(zf.open(info).read())
def main(args):
options, args = getopt.getopt(args, "e:")
opt = dict(options)
encoding = opt.get("-e", "euc-kr")
for file in args:
zf = zipfile.ZipFile(file)
decompress(zf, encoding)
if __name__ == "__main__":
main(sys.argv[1:])
./unzip.py -e euc-kr filename.zip 하면 현재 디렉토리에 푸는 코드. 캡단순 ㄱㅅ 오류처리따위 하지 않았습니다. -_-



