6

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

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

...
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());
    ...
}
4

1 に答える 1

9

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

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

今ではそれは魅力のように機能します。

于 2012-06-30T18:11:03.527 に答える