Я борюсь со странной проблемой кодирования имени файла при перечислении содержимого каталога в Java 6 как для OS X, так и для Linux: 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):
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
. Ничто не помогает, и я не хочу прибегать к таким хакам.
В отличие от этого (несколько связанного?) вопроса, я могу читать данные из перечисленных файлов, несмотря на нечетные имена