Java Properties проблема с чтением русских букв

496
28 декабря 2016, 03:20

Доброго времени суток. Есть проблема с чтением файла Properties, содержащего русские буквы. Слово Нахабино считывается как ???°???°?±??????. Вот код:

Properties mProperties = new Properties();
mProperties.load(new FileInputStream(desktop + "pr.properties"));
System.out.println(mProperties.getProperty("setA"));

Пробовал при помощи Notepad++ менять кодировку файла на Asii, UTF-8, UTF-8 без BOM, UCS2, и ещё несколько. Результат - в одной кодировке вопросики и плюсики, в другой квадратики и кружочки и т.д. Помогите исправить ошибку.

Answer 1

Согласно стандарту, .properties файлы содержат текст в кодировке ISO 8859-1. Это создает определенные трудности при работе с кириллическими символами, т.к. все тот же стандарт предписывает кодировать их как escape-последовательности Unicode. Что выглядит не очень читабельно:

some.key=\u0417\u043D\u0430\u0447\u0435\u043D\u0438\u0435

К счастью, IDE имеют функциональность (встроенную или через плагины) для прозрачного преобразования кодировки, называемую native-to-ascii conversion. Благодаря этому, вы можете при редактировании видеть в IDE понятный текст:

some.key=Значение

который будет фактически преобразован в текст из предыдущего примера.

При загрузке файла через класс Properties вы будете иметь дело уже с java-строками в Unicode и кириллица там будет такая, как вы ожидаете.

Answer 2

Я создал вот такой прекрасный класс:

private class MyProperties {
    private File mFile;
    private ArrayList<String> keys = new ArrayList<String>(), values = new ArrayList<String>();
    MyProperties() throws Throwable {
        // FileInputStream fis...
        // загружаем в массивы keys и values значения
    }
    synchronized ArrayList<String> keySet() {
        return this.keys;
    }
    synchronized String getProperty(String key, String defaultValue) {
        for (int i1 = 0; i1 < this.keys.size(); i1++) {
            if (this.keys.get(i1).equals(key)) {
                return this.values.get(i1);
            }
        }
        return defaultValue;
    }
    synchronized void setProperty(String key, String value) throws Throwable {
        this.values.set(this.keys.indexOf(key), value);
        DataOutputStream out = new DataOutputStream(new FileOutputStream(this.mFile));
        for (int i1 = 0; i1 < this.keys.size(); i1++) {
            out.writeBytes(this.keys.get(i1) + "=" + this.values.get(i1));
        }
        out.flush();
        out.close();
    }
}

жить с ним просто чудо. Не надо теперь париться по поводу каких-то кодировок и русских букв. Читает всё подряд.

READ ALSO
Collections.unmodifiable* как определить?

Collections.unmodifiable* как определить?

Известно, что есть класс javautil

361
Как наложить картинку на блок?

Как наложить картинку на блок?

У меня есть блок и есть картинкаКак наложить одно на другое?

539
Проблемы с подключенным шрифтом

Проблемы с подключенным шрифтом

При подключении шрифта из google fonts, начинают смещаться соседние элементы от элементов с установленным шрифтомЧто за косяки? первую проблему...

331