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