У меня есть эта проблема, которая выпала на меня, и прошло несколько дней неудачных поисков и обходных попыток.
У меня теперь есть встроенная программа java swing, распространяемая 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 on, и если вы запустите свой java vm в xxxx.UTF-8 locale, file.encoding должен быть UTF-8, установленный в MacRoman, будет проблематичным. Поэтому я считаю, что Oracle/OpenJDK7 ведет себя правильно. Тем не менее, как Андрей Томпсон отметил, что если все предыдущие выпуски Apple JDK используют MacRoman как file.encoding для английского языка /UTF -8, существует "совместимость" здесь, возможно, стоит положить что-то в релиз, чтобы дать пользователям Oracle/OpenJDK MacOS хедз-ап.
from Joni Salonen блог (java-and-file-names-with-invalid-characters) Я знаю, что:
Вероятно, вы знаете, что 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=
наиболее похожей проблемой для stackoverflow с решением является следующее: encoding-issues-on-java-7-file-names-in-os-x
но решение обертывает выполнение java-программы в script с помощью
#!/bin/bash
export LC_CTYPE="UTF-8" # Try other options if this doesn't work
exec java your.program.Here
но я не думаю, что этот параметр доступен мне из-за веб-старта, и я не нашел способа установить переменную среды LC_CTYPE из программы.
Любые решения или обходные пути?
P.S.:
Если мы запускаем программу непосредственно из оболочки, она корректно записывает файл/каталог даже на OSX 10 + Java 7. Проблема возникает только при использовании комбинации JNLP + OSX + Java7