2012-04-02 14 views
7

内のファイル名にUnicode文字を使用すると、別のフォルダにPéréquationLES HOPITAUX NEUFS.xlsのようないくつかの特殊文字が含まれている、一時は言います。私は、ファイル名をビュンいzipアーカイブ

私は、ファイルを圧縮することが可能だが、問題は、ファイルの名前が P +¬r+¬quationLES HOPITAUX NEUFS.xlsに自動的に変更されています。

zipアーカイブ内のファイル名にUnicode文字をサポートするにはどうすればよいですか?

+0

こんにちは、これを見てくださいzip compress probem http://stackoverflow.com/a/21521784/1194578 – mathi

答えて

16

これは、アーカイブの作成に使用しているコードによって少し異なります。 古い Java圧縮クラスは、必要なだけ柔軟性がありません。

Apache Commons Compressを使用できます。あなたは、Java 7を使用しているなら、あなたは最終的にZipOutputStream constructor

に(つまり、UTF-8可能)大きな問題をCharsetパラメータを持っている

ZipArchiveOutputStream ostream = ...; // Your initialization code here 
ostream.setEncoding("Cp437"); // This should handle your "special" characters 
ostream.setFallbackToUTF8(true); // For "unknown" characters! 
ostream.setUseLanguageEncodingFlag(true);        
ostream.setCreateUnicodeExtraFields(
    ZipArchiveOutputStream.UnicodeExtraFieldPolicy.NOT_ENCODEABLE); 

、:Michael Simonsは、コードのこの素敵な作品を書きましたとにかく、多くの実装でUnicodeエンコーディングが理解できないというのは、オリジナルののZIPファイル形式はASCIIであり、Unicodeの公式な標準はないからです。詳細はthis postを参照してください。

+0

私はZipOutputStreamクラスを使用しています... – Maddy

+2

ストリーム上でsetEncoding( "UTF-8")を呼び出すか、FileOutputStreamコンストラクタのパラメータとして渡します。とにかく、答えに指摘されている互換性の問題を忘れないでください! –

+0

import java.util.zip.ZipOutputStream;私が使用しているパッケージはsetEncoding( "UTF-8")をサポートしていません – Maddy

6

Zip仕様では、組み込みのファイル名とコメントに使用する文字エンコーディングは指定されていませんが、IBMコードページ437と呼ばれる元のIBM PC文字エンコーディングセットは、サポートされているエンコード一方、Jar仕様では、Jarファイル内のすべてのファイル名とコメントをエンコードおよびデコードするためのエンコードとしてUTF-8を使用することを明示しています。 Jar/Zipファイルに格納されているファイル名とコメントを扱う際には、java.util.jarとjava.util.zipの実装が厳密にJar仕様に従って、UTF-8を唯一のエンコーディングとして使用していました。

結論? "従来の" ZIPツールで作成されたZIPファイルは、java.util.jar/zipベースのツールではアクセスできません。その逆もあります。ファイル名にCp437間で互換性のない文字が含まれている場合(代わりに、 UTF-8

ほとんどのヨーロッパ人にとっては、ウムラウトなどの文字の「一握り」を避ける必要があるだけで、あなたは「ラッキー」です:-) )、日本語と中国語の場合、文字の大部分は単に運が悪いだけです。これは、バグ4244499が長年にわたりトップ25 JavaバグのNo.1となっていた理由です。バグはもうリ​​ストにはありません:-) OpenJDK 7、b57では最終的に "修正"されています。

JDK7 b57のソリューション(「解決策」よりも「解決策」を使用する)は、新しいZipInputStream ZipOutStreamおよびZipFileコンストラクタセットを導入することです。以下に示すように、特定の「charset」をパラメータとして使用します。

ZIPファイル(ファイル、文字セット)

ZipInputStream(入力ストリーム、文字セット)

ZipOutputStream(OutputStreamを、文字セット)

これらの新しいコンストラクタでは、アプリケーションは、これらのアクセスすることができます特定のエンコーディングで作成されたZipInputStreamまたはZipFileオブジェクト経由の非UTF-8 ZIPファイル、または新しいZipOutputStream(os、c)を介した非UTF-8でエンコードされたZipファイルの作成harset)コンストラクタを使用します。

zipは、エントリ名とコメントの非UTF8エンコーディングをサポートするための "-encoding"オプション付きのJarツールの除外版です。新しいAPIの使用方法のデモとして役立ちますユニットテストとして)。 Jarツールに正式に "-encoding"を導入することをお勧めしますと、私はまだ議論しています...

+0

私はJava 6を使用しています:) – Maddy

関連する問題