2012-06-30 9 views
5

Java 7は、UTF-8以外の文字セットでZIPアーカイブを解凍するという古い問題を修正することになっています。これはコンストラクタZipInputStream(InputStream, Charset)によって実現できます。ここまでは順調ですね。 ISO-8859-1文字セットを明示的に設定すると、ウムラウト付きのファイル名を含むzipアーカイブを解凍できます。ZipInputStream(InputStream、Charset)はZipEntryファイル名を誤ってデコードします

ここでは、問題があります。ZipInputStream.getNextEntry()を使用してストリームを反復するとき、エントリの名前に間違った特殊文字が含まれています。私の場合、ウムラウト "ü"は "?"文字は明らかに間違っています。誰もがこれを修正する方法を知っていますか?明らかにZipEntryは、その基礎となるZipInputStreamCharsetを無視します。それはまだ別のzip関連のJDKバグのように見えますが、私は間違ったことをしているかもしれません。

... 
zipStream = new ZipInputStream(
    new BufferedInputStream(new FileInputStream(archiveFile), BUFFER_SIZE), 
    Charset.forName("ISO-8859-1") 
); 
while ((zipEntry = zipStream.getNextEntry()) != null) { 
    // wrong name here, something like "M?nchen" instead of "München" 
    System.out.println(zipEntry.getName()); 
    ... 
} 
+0

Java SE6のベストプラクティスは何ですか? (SE7へのアップグレード以外に): – basZero

+0

SE6の場合:VMパラメータ 'zip.altEncoding'または' zip.encoding'を 'Cp437'または' ISO-8859-1'に設定してテストしましたが、両方が正しく読み取られませんでした – basZero

+0

@ basZero:Apache Commons圧縮はうまく動作します。私はすぐに解決策を見つけませんでした。 – kriegaex

答えて

6

OMGは、私が2かそこらの時間遊んが、私は最終的にここに質問を投稿した後、わずか5分では、私は答えにぶつかった:私のzipファイルにはISO-8859-1でエンコードされていなかったが、 Cp437である。そのため、コンストラクタの呼び出しは次のようになります。

zipStream = new ZipInputStream(
    new BufferedInputStream(new FileInputStream(archiveFile), BUFFER_SIZE), 
    Charset.forName("Cp437") 
); 

これは魅力的です。とにかく迷惑して申し訳ありません。私はこれが他の人が同様の問題に直面するのを助けることを願っています

+0

私は、あなたがこの記事で自分で書いたとしても、正しい答えとして受け入れることができると思います:http://blog.stackoverflow.com/2011/07/its-ok-to-ask-and-answer-your-自分の質問/ – seh

関連する問題