Я запускаю небольшое приложение Java на встроенной платформе Linux. После замены Java VM JamVM на OpenJDK имена файлов со специальными символами не сохраняются правильно. Специальные символы, такие как умляуты, заменяются вопросительными знаками.
Вот мой тестовый код:
import java.io.File;
import java.io.IOException;
public class FilenameEncoding
{
public static void main (String[] args) {
String name = "umlaute-äöü";
System.out.println("\nname = " + name);
System.out.print("name in Bytes: ");
for (byte b : name.getBytes()) {
System.out.print(Integer.toHexString(b & 255) + " ");
}
System.out.println();
try {
File f = new File(name);
f.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
}
Его запуск дает следующий результат:
name = umlaute-???
name in Bytes: 75 6d 6c 61 75 74 65 2d 3f 3f 3f
а файл называется umlaute - ??? создано.
Установка свойств file.encoding и sun.jnu.encoding в UTF-8 дает правильные строки в терминале, но созданный файл по-прежнему umlaute - ???
Запустив виртуальную машину с помощью strace, я вижу системный вызов
open("umlaute-???", O_RDWR|O_CREAT|O_EXCL|O_LARGEFILE, 0666) = 4
Это показывает, что проблема не в файловой системе, а в одной виртуальной машине.
Как можно установить кодировку имени файла?
new String(bytes[])
, не используйтеstring.getBytes()
, не используйте новыйInputStreamReader(InputStream)
и делайте не использоватьnew OutputStreamWriter(OutputStream)
. Они используют кодировку платформы по умолчанию, которая эквивалентна зависимости от глобальной переменной с существенно случайным значением. Укажите кодировку, которую вы используете, если вы не хотите, чтобы ваша программа неожиданно прерывалась необъяснимым образом в какой-то непредсказуемый момент в будущем на какой-либо другой платформе или для другого пользователя. - person Christoffer Hammarström   schedule 12.04.2012