1

ソリューションで更新、下部を参照

要件
ファイル名に特殊文字が含まれるファイルを含むZIPファイルをJavaSE6で処理します。(ZIPプロデューサーの)エンコードはUTF-8ではないため、特殊文字がエンコードされます。したがって、特殊文字を適切なコードに修正したいと思います。

問題
ZIPに。というファイルが含まれていますabcüabc.txt。エントリはを介して処理さjava.util.zip.ZipEntryれ、単一の文字を印刷すると、次の文字(バイト)が表示されます。

ü次のようにエンコードされ
uます
¨

質問
それで、私はそれをどのように置き換えることができるか知りたいüですue

私がすでに試したがうまくいかなかったこと:
name.replaceAll("u\\¨", "ue");
または
name.replaceAll("ü", "ue");

元のソースコード(機能していません)

InputStream is = new FileInputStream(new File("/Users/me/Desktop/test.zip"));
ZipInputStream zipStream = new ZipInputStream(is);
ZipEntry zipEntry = null;
while ((zipEntry = zipStream.getNextEntry()) != null) {
    String name = zipEntry.getName(); // reading abcüabc.txt
    System.out.println("pos 3: "+name.charAt(3));
    System.out.println("pos 4: "+name.charAt(4));
    System.out.println("is equal to ¨: "+Character.toString(name.charAt(4)).equals("¨"));
}        

出力:

pos 3: u
pos 4:¨
is equal to ¨: false

私の環境に関するメモ

Mac OS X 10.6.8
Java SE 6で生成されたZip:Java HotSpot(TM)64ビットサーバーVM(ビルド20.12-b01-434、混合モード)

解決

明らかに、ZIPプロデューサー(私の場合はMac OSX)は、特殊文字を分解された形式に変換します。したがって、üはに分解されます。
ZIPからファイル名を抽出する際に、分解された形式から合成された形式に変換し直したいので、上からソースコードに正規化を挿入するだけで済みます。

InputStream is = new FileInputStream(new File("/Users/me/Desktop/test.zip"));
ZipInputStream zipStream = new ZipInputStream(is);
ZipEntry zipEntry = null;
while ((zipEntry = zipStream.getNextEntry()) != null) {
    String name = zipEntry.getName(); // reading abcüabc.txt
    System.out.println("pos 3: "+name.charAt(3));
    System.out.println("pos 4: "+name.charAt(4));
    System.out.println("contains ü: "+name.contains("ü"));
    name = Normalizer.normalize(name, Form.NFC);
    System.out.println("contains ü: "+name.contains("ü"));
}        

出力:

pos 3: u
pos 4:¨
contains ü: false
contains ü: true
4

2 に答える 2

3

これは¨U + 00A8 DIAERESIS)ではなく、U + 0308COMBININGDIAERESISです

Mac Osはファイル名を正規化フォームDに保存し、このように文字を分解するため、文字はこのように分割されます。

次のように構成し直すことができます。

String name = zipEntry.getName(); 
name = Normalizer.normalize(name, Form.NFC);

正規化フォームの詳細

ダイアエレシスの違いは、前の基本文字を変更する方法と変更しない方法です。

    System.out.println( "u" + (char)0xA8); //u¨
    System.out.println( "u" + (char)0x0308); //ü
于 2013-01-07T13:04:01.803 に答える
0

apache antエンコーディングの問題を解決するために使用できます。

輸入org.apache.tools.zip.*

ZipFile zipFile = new ZipFile(fileName,"you encoding");// you encoding like utf-8 
Enumeration emu = zipFile.getEntries();


while(emu.hasMoreElements()){
  ZipEntry entry = (ZipEntry) emu.nextElement();
  // do something
}

Antプロジェクトはオンラインドキュメントを提供していません。ここに別のドキュメントがありますhttp://api.dpml.net/ant/1.7.0/

于 2013-01-07T13:03:39.073 に答える