Проблема кодирования имени файла с 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

Ответы на вопрос(5)

Ваш ответ на вопрос