2011-01-11 3 views
4

DotNetZip 라이브러리를 사용하여 파일의 압축을 해제하려고합니다.DotNetZip 라이브러리 사용 비 ASCII 문자로 파일 압축 해제

파일에 덴마크어 문자 (øøåÆØÅ)가 포함 된 폴더 및 파일이 들어 있습니다.

TotalCommander, 7Zip, Windows zip은 모두 파일을 올바르게 추출하지만 DotNetZip Library는 덴마크어 문자를 압축합니다.

예 : File_æøåÆØÅ.txt

File_æ¢åÆ¥Å.txt이되고 그것이 ¢ 포함 의 insted. insted는 Ø이며 ¥을 포함합니다.

코드 : UTF8 등과 같은

using (var zipFile = ZipFile.Read(@"File_æøåÆØÅ.zip")) 
{ 
    zipFile.ExtractAll(@"File_æøåÆØÅ", 
         ExtractExistingFileAction.OverwriteSilently); 
} 

나는 기본 인코딩 ("DA-DK"문화)를 사용하고, 내가 시도 다른 인코딩

나는 파일 이름을 포함하는 파일의 압축을 풀 수있는 방법 덴마크 문자로?

+0

Sharpziplib http://www.icsharpcode.net/opensource/sharpziplib/ 작품. –

답변

0

"DotNetZip"의 버그와 비슷합니다. SharpZipLib 또는 ZipPackage (BCL에서)을 시도 했습니까? 인코딩은 일반적으로 내용 인과 관련이 있습니다. 그래서 이것은 하나의 요소가되어서는 안됩니다.

작성자에게 report this (예문 사용)을 제공해야합니다.

+0

SharpZipLib와 호환됩니다. –

+5

이것은 버그가 아닙니다. DotNetZip은 파일 이름에 비 ASCII 문자와 관련하여 zip 사양을 따릅니다. 그런 zip 파일을 읽을 때 코드 페이지를 지정할 수있는 ZipFile.Read() 오버로드를 사용해야합니다. ZIP 스펙에서 지원되는 기본 형식은 IBM437 (효과적으로 ASCII의 서브 세트) 및 UTF8입니다. 파일이 코드 페이지를 명시 적으로 지정해야하는 파일이 아닌 경우 - 모든 라이브러리가 zip 파일의 올바른 페이지를 확실하게 유추 할 수있는 방법이 없습니다. 다른 라이브러리와 마찬가지로 "바탕 화면의 기본 코드 페이지"라고 가정하면 올바르지 않고 위험합니다. – Cheeso

+0

또한 코드 페이지 처리는 모두 DotNetZip의 도움말 파일에 광범위하게 설명되어 있습니다. – Cheeso

2

필자는 읽기 용으로 필자가 사용하고 있었고, 필자는 그것을 기억하고 있었다 (DotNetZip-v1.9).

var encoding = System.Text.Encoding.GetEncoding("da-DK"); 
using (var zipFile = ZipFile.Read(@"File_æøåÆØÅ.zip", encoding)) { 
    zipFile.ExtractAll(@"File_æøåÆØÅ", 
        ExtractExistingFileAction.OverwriteSilently); 
} 

이유 당신에게 : 읽기 코드 :

using (FileStream fs = File.OpenRead(filePath)) 
{ 
    ZipFile zf = ZipFile.Read(fs); 
    ICollection<ZipEntry> entries = zf.Entries; 
    foreach (ZipEntry entry in entries) 
    { 
      string path = entry.FileName; // 
    } 
} 

및 우편 아카이브 만들기위한

: 우편을 읽을 때 ZipFile zip = new ZipFile(Encoding.UTF8);

3

그 zip 파일을 처리하려면, 명시 적으로 덴마크의 코드 페이지를 지정
zip 스펙은 zip 파일 내의 파일 이름 및 주석에 대해 두 개의 텍스트 인코딩 인 IBM437 및 UTF8을 허용합니다. 이러한 호환 인코딩 중 하나를 사용하면 zipfile 메타 데이터가 명시 적으로 지정합니다. DotNetZip 또는 모든 라이브러리는 zip 파일에 지정된 인코딩을 자신있게 사용할 수 있습니다.

zip 파일이 둘 중 하나가 아닌 인코딩을 지정하는 방법은 없습니다. Zip 스펙은이를 수행하는 방법을 제공하지 않습니다. 일부 zip 라이브러리 또는 도구는 이와 관련하여 사양을 준수하지 않는 zip 파일을 생성합니다. zip 파일은 "da-DK"또는 CP950과 같은 텍스트 인코딩을 사용합니다. 엄밀히 말하면 사양에 맞지 않지만 도구로 구성됩니다. 이와 같은 Zip 파일은 드문 일이 아닙니다.

이와 같은 경우 일부 라이브러리 또는 도구는 zip 파일에 사용 된 인코딩이 시스템의 기본 인코딩과 같다고 추측합니다. 이것은 안전하지 않거나 작동하도록 보장되지만 작은 경우에는 작동합니다. zip 파일은 로컬 시스템의 호환되지 않는 라이브러리 나 도구로 만들어졌습니다. 기본 (비 호환) 텍스트 인코딩을 사용하여 zip 파일을 만든 다음 Stokholm에서 Shanghai로 보내면 읽는 시점에 "기본 인코딩 사용"전략을 사용하는 것이 실패합니다.

DotNetZip은 가정을하지 않습니다. zipfile이 비 호환 텍스트 인코딩을 사용하는 경우 zipfile에 어떤 인코딩이 사용되는지 알 수 없으므로 DotNetZip은 표준 인코딩 -IBM437을 사용하여 파일을 읽습니다. DNZ가 이것이 "잘못"되었다는 것을 알 수있는 방법이 없습니다. 해당 동작을 재정의하려면 다른 인코딩을 허용하는 ZipFile.Read() 메서드를 사용해야합니다.

이것은 모두 DotNetZip documentation, 특히 ZipFile.ProvisionalAlternateEncoding 속성에 설명되어 있습니다. 항상 압축 인코딩을 무시하기 때문에 무슨 일이 실제로 사용하는 압축에도 불구하고

zip.AlternateEncodingUsage = ZipOption.Always; 

사용하여 최우선 DotNetZip 기본 인코딩의

0

첫째, 위험합니다. 내가 필요로 할 때

zip.AlternateEncoding = System.Text.Encoding.UTF8; 
zip.AlternateEncodingUsage = ZipOption.AsNecessary; 

그래서 UTF-8을 사용하여 자신이 사용했다.

코드 페이지와 관련된 논의 -이 문제는 dotnetzip 자체 (로컬 복사본)에서 수정되었으며 기본 코드 페이지가 "ibm437"에서 "ibm861"으로 변경되었습니다.

나는 특수한 종류의 zip을 만들기 위해 7-zip과 windows 압축 도구를 사용했으며 파일 이름에 특수 문자 'ø'를 사용했습니다. 테스트 결과에 따라 Windows 및 7-zip에서 사용되는 기본 인코딩은 대부분의 문서에서 지정한 것처럼 "ibm437"이 아니라 "ibm861"입니다.

"ibm437"문자열을 검색하고이를 dotnetzip 자체에서 "ibm861"으로 바꾸면 수정 사항을 적용 할 수 있습니다. http://www.nudoq.org/#!/Packages/DotNetZip/Ionic.Zip/ZipInputStream/P/ProvisionalAlternateEncoding

0

내가 압축 해제에 문제가 했어 : 나는 인코딩 페이지에 대한 몇 가지 언급 위치한 곳에있다

이다. zip 파일에서 내 앱에는 šđčćž과 같은 특별한 동유럽 문자가 있어야합니다. WinRAR 또는 7Zip은 압축을 풀었지만 DNZ 라이브러리 (IonicZip 1.9.1.8) 대신 μ를 받았습니다.

나는 15 개의 서로 다른 encondings를 시도했다. 마침내 주어진 zip 파일은 ibm852라는 것을 알게되었다. 자,이 코드 샘플은 나를 위해 일한 : 아마 당신이해야합니다, 나는 이유를 조사 할 시간이 없어

using (ZipFile zz = ZipFile.Read(path)) 
{ 
    zz.AlternateEncodingUsage = ZipOption.Always; 
    zz.AlternateEncoding = System.Text.Encoding.GetEncoding("ibm852"); 
    zz.ExtractAll(loc, ExtractExistingFileAction.OverwriteSilently); 
} 

:

ZipFile zf = new ZipFile(path, System.Text.Encoding.GetEncoding("ibm852")); 
zf.ExtractAll(loc, ExtractExistingFileAction.OverwriteSilently); 

내게 도움이되지 않았다 다음 코드에서와 같이 AlternateEncoding 속성을 설정 Read 메서드에서 인코딩 매개 변수를 찾지 못했기 때문에 생성자를 호출 할 때 인코딩을 설정했습니다.

관련 문제