Проблема кодирования имени файла с Java 7 на OSX с помощью jnlp / webstart
У меня возникла эта проблема, и я провел пару дней безуспешных поисков и попыток обхода.
Теперь у меня есть внутренняя java-программа, распространяемая jnlp / webstart на компьютерах osx и windows, которая, помимо прочего, загружает некоторые файлы из WebDav.
Недавно на тестовой машине с OSX 10.8 и Java 7 имена файлов и каталогов с акцентированными символами начали заменяться на знаки вопроса.
Нет проблем на OSX с версиями Java до 7.
пример :
XXXYYY_è_ABCD /
становится
XXXYYY _? _ ABCD /
с помощьюjava.text.Normalizer (NFD, NFC, NFKD, NFKC) в исходной строке, результат другой, но все же неверный:
XXXYYY_e? _ABCD /
или же
XXXYYY_e_ABCD /
Из переписки [andrew.brygin at oracle.com] и [mik3hall at gmail.com] я знаю, что
Да, file.encoding устанавливается на основе локали, на которой работает jvm, и если вы запускаете java vm в локали xxxx.UTF-8, file.encoding должен быть UTF-8, установить MacRoman будет проблематично. Поэтому я считаю, что Oracle / OpenJDK7 ведет себя правильно. Тем не менее, как отметил Эндрю Томпсон, если все предыдущие выпуски Apple JDK используют MacRoman в качестве file.encoding для английской / UTF-8 локали, существует "совместимость" В связи с этим, возможно, стоит добавить что-то в примечание к выпуску, чтобы дать пользователю Oracle / OpenJDK MacOS преимущество.
отДжони Салонен блог (Java-и-файл-имена-с-недействительных-символов) я знаю это :
Вы, наверное, знаете, что Java использует «кодировка символов по умолчанию » преобразовать двоичные данные в строки. Для чтения или записи текста с использованием другой кодировки вы можете использовать InputStreamReader или OutputStreamWriter. Но для преобразования данных в текст глубоко в API у вас нет выбора, кроме как изменить кодировку по умолчанию.
а также
Как насчет file.encoding?
Системное свойство file.encoding также можно использовать для установки кодировки символов по умолчанию, которую Java использует для ввода-вывода. К сожалению, похоже, что это никак не влияет на то, как имена файлов декодируются в строки.
выполнение локали изнутри jnlp неизменно печатает
LANG=
LC_COLLATE="C"
LC_CTYPE="C"
LC_MESSAGES="C"
LC_MONETARY="C"
LC_NUMERIC="C"
LC_TIME="C"
LC_ALL=
Наиболее похожая проблема для решения проблемы со стеком:кодирование-вопросы-на-Java-7-файлов-имен-в-OS-X
но решение оборачивает выполнение Java-программы в сценарий с
#!/bin/bash
export LC_CTYPE="UTF-8" # Try other options if this doesn't work
exec java your.program.Here
но я неЯ не думаю, что эта опция доступна для меня из-за веб-запуска, и я неНе нашел способа установить переменную окружения LC_CTYPE из программы.
Любые решения или обходные пути?
Постскриптум :
Если мы запускаем программу прямо из оболочки, она правильно записывает файл / каталог даже на OSX 10 + Java 7. Проблема возникает только при сочетании JNLP + OSX + Java7