ソリューションで更新、下部を参照
要件:
ファイル名に特殊文字が含まれるファイルを含むZIPファイルをJavaSE6で処理します。(ZIPプロデューサーの)エンコードはUTF-8ではないため、特殊文字がエンコードされます。したがって、特殊文字を適切なコードに修正したいと思います。
問題:
ZIPに。というファイルが含まれていますabcüabc.txt
。エントリはを介して処理さjava.util.zip.ZipEntry
れ、単一の文字を印刷すると、次の文字(バイト)が表示されます。
ü
次のようにエンコードされ
u
ます
¨
質問:
それで、私はそれをどのように置き換えることができるか知り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)は、特殊文字を分解された形式に変換します。したがって、ü
はに分解されu¨
ます。
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