2009-12-02 8 views
4

사람들은 요즘 국제화 된 (즉, 비 라틴어 : 키릴 문자, 그리스어, 중국어, 사용자 이름) 파일 이름을 허용하는 WinZIP을 사용하여 ZIP 아카이브를 만듭니다.I18N 파일 이름으로 WinZIP로 만든 파일의 압축을 풉니 다?

슬프게도 그러한 파일의 압축을 풀려고하면 다음과 같은 문제가 발생합니다. UNIX unzip은 "£ ¤ © ¤ ¥ èì"와 같은 가비지 파일과 dir을 만듭니다. Java 및 해당 jar 명령은 이러한 아카이브에서 비참하게 실패합니다.

프로그래밍 방식으로 이러한 파일의 압축을 푸는 방법은 있습니까? 유닉스 또는 자바.

답변

2

내가 찾은 해결책은 다음과 같습니다. 올바른 대체 문자 세트가 제공된 경우 Apache commons-compress는 이러한 아카이브를 압축 해제 할 수 있습니다.

3

DotNetZip은 zip 파일을 읽거나 쓸 때 zip 파일 내의 파일 이름에 대한 유니 코드 및 임의의 인코딩을 지원합니다.

. NET 라이브러리입니다. 유닉스 사용을 위해서는 Mono가 필수적으로 필요합니다.

zip 파일이 WinZip에 의해 올바르게 작성된 경우, 즉 the zip spec from PKWare과 호환되는 경우 압축을 풀 때 인코딩을 지정하기 위해 수행해야 할 특별한 작업이 없습니다. zip 스펙에 따르면 zip 파일의 파일 이름으로 사용되는 두 가지 지원되는 인코딩 인 UTF-8 및 IBM437이 있습니다. 이러한 인코딩 중 하나 또는 둘 모두를 사용하면 zip 메타 데이터에 지정되며 모든 zip 라이브러리 을 사용하면을 찾아서 사용할 수 있습니다. DotNetZip은 호환 지퍼를 읽을 때 자동으로 감지합니다. 다음과 같이하십시오 :

using (var zip = ZipFile.Read("thearchive.zip")) 
{ 
    foreach (var e in zip) 
    { 
     // e.FileName refers to the name on the entry 
     e.Extract("extract-directory"); 
    } 
} 

"비 호환"w.r.t. 인 압축을 생성하는 아카이브 프로그램이 있습니다. 부호화. WinRar는 하나입니다 - 컴퓨터에서 사용중인 기본 인코딩으로 인코딩 된 파일 이름을 가진 압축 파일을 만듭니다. 상하이에서는 cp950을 사용하고, 아이슬란드에서는 뭔가를, 리스본에서는 다른 것을 사용합니다. 여기서 "비준수"의 이점은 Windows 탐색기가 열리고 zip으로 i18n 크기의 파일 이름을 올바르게 표시한다는 것입니다. 즉, Windows는 (아직까지도) UTF-8 zip 파일을 지원하지 않기 때문에 "비 준수"가 종종 사람들이 원하는 것입니다.

(이것은 모두가 ZipFile에 사용되는 인코딩이 아닌 zip 파일에 포함 된 파일에 사용되는 인코딩과 관련이있다)

우편 스펙은 임의의 텍스트 인코딩의 사양을 허용하지 않습니다 zip 메타 데이터 즉, zip을 만들 때 cp950을 사용하면 압축을 풀 때 cp950을 사용하기 위해 추출 논리가 "알고"있어야합니다. zip 파일의 아무 것도 해당 정보를 전달하지 않습니다. 물론 프로그래밍 방식으로 추출하는 데 사용하는 zip 라이브러리는 임의의 인코딩을 지원해야합니다. 내가 아는 한, Java의 zip 라이브러리는 그렇지 않습니다. DotNetZip 않습니다. 마찬가지로 :

using (ZipFile zip = ZipFile.Read(zipToExtract, 
            System.Text.Encoding.GetEncoding(950))) 
{ 
    foreach (ZipEntry e in zip) 
    { 
    e.Extract(extractDirectory); 
    } 
} 

DotNetZip은 "비 규격"zip이라는 임의의 인코딩을 사용하여 zip 파일을 만들 수도 있습니다.

DotNetZip은 무료이며 오픈 소스입니다.

+1

이미 저장소에 있기 때문에 7z를 설치하는 것이 더 쉽습니다. – alamar

관련 문제