Как читать "разделитель списков" из ОС в Java?
Я пишу экспортер CSV на Java, который должен уважать пользовательские настройки пользователя, особенно "разделитель списка" для использования в качестве разделителя.
в Windows можно установить этот разделитель списка в
Control Panel -> Regional and Language Options -> Regional Options -> Customize
Я не знаю о других операционных системах, но я уверен, что вы можете изменить это на других ОС.
каков наилучший способ получить этот пользовательский параметр из ОС в Java? Я нахожусь в среде Eclipse RCP, поэтому я могу использовать Решения, связанные с RCP, если есть что-то доступное.
6 ответов
из комментарий ответ:
чтение настроек для конкретной ОС-это необходимость I есть, чтобы встретиться.
Так что, если ОС, кроме Windows нет такая установка?
Я предлагаю вам прочитать его из реестра в Windows (как указано здесь):чтение / запись в реестр Windows с помощью Java. На других платформах просто используйте хороший дефолт, а возможно, хотя бы на Unix, также поддержите настраивать его через переменную окружающей среды таможни (которую вы документируете хорошо):как мой код java может читать переменные среды ОС?.
мое чутье, что OSs универсально не имеют (общесистемного или пользовательского) параметра "разделитель списков", может быть неправильным, конечно, но я сомневаюсь в этом.
не прибегая к конкретному решению платформы, я думаю, что лучшим подходом будет позволить пользователям указать свои предпочтения разделителя списков в вашем собственном приложении. Либо в панели настроек, диалоговом окне экспорта или с помощью необязательного аргумента командной строки.
в дополнение к предоставлению вашей собственной опции пользователю в вашем приложении вы можете попытаться угадать, что такое разделитель списка.
Я посмотрел на некоторые локали в окнах и увидел, что разделитель списка либо "; "или",". Я слышал, что есть еще один персонаж в каком-то неясном месте, но сам его не видел. Поэтому, если вы можете сделать свой код для обработки обоих"; "и", " в качестве разделителей списка, вы, вероятно, охватите большинство случаев.
и еще, похоже, если", "используется в качестве десятичного разделителя, то", " никогда не используется в качестве разделителя списка. Я предполагаю, что в противном случае числа будет невозможно различить в списке: 1,2,3,4 может быть 1.2, 3.4 или 1, 2.3 в этих случаях ";" используется в качестве разделителя списка. К сожалению, обратное неверно. Арабский язык "."как десятичный символ и"; " как разделитель списка.
поэтому я думаю, что правило, которое можно разумно безопасно соблюдать:
if (decimalSeparator == ',')
then listSeparator = ';'
else if (decimalSeparator == '.')
then listSeparator = new char[] {';', ','}
из любопытства я немного искал тему, и действительно, Java, похоже, не имеет такого понятия из коробки.
на Locales Demo дает довольно полный список настроек локали, и там нет разделителя списка.
увидел вопрос форума ссылаясь на солнце.текст.пакет ресурсов, который является частным и устаревшим. Вы не найдете много других ссылок на этот пакет, похоже, он живет в jre/lib/ext/localedata.сосуд хотя в моей последней копии перечислены в основном азиатские места.
приведенные выше советы звучат, или вы можете исследовать и использовать частный список для каждой локали. Я бы посмотрел, возможно, на библиотеку ICU IBM (язык C, я думаю), которая, кажется, имеет довольно большой список настроек локали. Согласно замечание, ICU сам получает свою информацию от стандарта ISO, который должен быть исследован как поставщик первичной информации.
Я столкнулся с той же проблемой, а также узнал, что единственным правильным решением является предоставление пользователю способа указать "разделитель выбора".
однако, если это невозможно, как это было в моем случае, ближе всего я мог бы добраться до кросс-platfrom, поддержка кросс-локали следующая:
- думаю, сепараторы, вы должны использовать DecimalFormatSymbols
- добавьте строку в начале CSV, содержащую, например, "sep=," (без quotes), это должно указать разделитель списка, который вы только что угадали
Это, по крайней мере, в большинстве случаев (случаи, которые я тестировал), заставит Excel использовать этот разделитель, даже если вы "угадали неправильно" и обеспечит хотя бы немного больше совместимости.
для windows он хранится в реестре по адресу:
"HKEY_CURRENT_USER\Control Panel\International"
Так что вы можете использовать что-то вроде этого
private void setDelimiterProperties(String delimiter) {
Properties p = new Properties();
String key = "HKEY_CURRENT_USER\Control Panel\International\sList";
p.setProperty(key, delimiter);
}