OS X と Linux の両方で Java 6 のディレクトリ コンテンツを一覧表示するときに、奇妙なファイル名エンコーディングの問題に苦しんでいます。File.listFiles()
および 関連するメソッドは、システムの残りの部分とは異なるエンコーディングでファイル名を返すようです。
問題を引き起こしているのは、これらのファイル名の表示だけではないことに注意してください。私は主にファイル名をリモート ファイル ストレージ システムと比較することに関心があるので、出力に使用される文字エンコーディングよりも名前文字列の内容に関心があります。
ここにデモンストレーションするプログラムがあります。Unicode 名でファイルを作成し、直接作成されたファイルから取得したファイル名のURL エンコードバージョンを出力し、親ディレクトリの下にリストされている場合は同じファイルを出力します (このコードは空のディレクトリで実行する必要があります)。結果は、File.listFiles()
メソッドによって返されたさまざまなエンコーディングを示しています。
String fileName = "Trîcky Nåme";
File file = new File(fileName);
file.createNewFile();
System.out.println("File name: " + URLEncoder.encode(file.getName(), "UTF-8"));
// Get parent (current) dir and list file contents
File parentDir = file.getAbsoluteFile().getParentFile();
File[] children = parentDir.listFiles();
for (File child: children) {
System.out.println("Listed name: " + URLEncoder.encode(child.getName(), "UTF-8"));
}
システムでこのテスト コードを実行すると、次のようになります。%CC
対%C3
文字表現に注意してください。
OS X Snow Leopard:
File name: Tri%CC%82cky+Na%CC%8Ame
Listed name: Tr%C3%AEcky+N%C3%A5me
$ java -version
java version "1.6.0_20"
Java(TM) SE Runtime Environment (build 1.6.0_20-b02-279-10M3065)
Java HotSpot(TM) 64-Bit Server VM (build 16.3-b01-279, mixed mode)
KUbuntu Linux (同じ OS X システム上の VM で実行):
File name: Tri%CC%82cky+Na%CC%8Ame
Listed name: Tr%C3%AEcky+N%C3%A5me
$ java -version
java version "1.6.0_18"
OpenJDK Runtime Environment (IcedTea6 1.8.1) (6b18-1.8.1-0ubuntu1)
OpenJDK Client VM (build 16.0-b13, mixed mode, sharing)
file.encoding
システムプロパティやさまざまなLC_CTYPE
環境LANG
変数の設定など、文字列を一致させるためにさまざまなハックを試しました。何も役に立ちませんし、そのようなハックに頼りたくもありません。
この(やや関連する)質問とは異なり、奇妙な名前にもかかわらず、リストされたファイルからデータを読み取ることができます