Как читать "разделитель списков" из ОС в 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);
}