Строка Java в кодировке UTF-8 в свойствах - PullRequest
11 голосов
/ 30 ноября 2011

У меня есть одна строка в кодировке UTF-8, представляющая собой цепочку пар ключ + значение, которую необходимо загрузить в объект Properties. Я заметил, что я получал искаженные символы в своей первоначальной реализации, и после небольшого поиска в Google я нашел этот Вопрос , в котором указывалось, в чем заключалась моя проблема - в основном это то, что Properties по умолчанию использует ISO-8859-1. Эта реализация выглядела как

public Properties load(String propertiesString) {
        Properties properties = new Properties();
        try {
            properties.load(new ByteArrayInputStream(propertiesString.getBytes()));
        } catch (IOException e) {
            logger.error(ExceptionUtils.getFullStackTrace(e));
        }
        return properties;
    }

Кодировка не указана, поэтому моя проблема. На мой вопрос, я не могу понять, как связать / создать комбинацию Reader / InputStream, чтобы перейти к Properties.load(), который использует предоставленную propertiesString и задает кодировку. Я думаю, что это в основном из-за моей неопытности в потоках ввода-вывода и, казалось бы, обширной библиотеки утилит ввода-вывода в пакете java.io.

Любой совет приветствуется.

Ответы [ 3 ]

13 голосов
/ 30 ноября 2011

Используйте Reader при работе со строками. InputStream с действительно предназначены для двоичных данных.

public Properties load(String propertiesString) {
    Properties properties = new Properties();
    properties.load(new StringReader(propertiesString));
    return properties;
}
2 голосов
/ 13 декабря 2016
   private Properties getProperties() throws IOException {
        ClassLoader classLoader = getClass().getClassLoader();
        InputStream input = classLoader.getResourceAsStream("your file");
        InputStreamReader inputStreamReader = new InputStreamReader(input, "UTF-8");
        Properties properties = new Properties();
        properties.load(inputStreamReader);
        return properties;
    }

затем использование

System.out.println(getProperties().getProperty("key"))
1 голос
/ 30 ноября 2011

Попробуйте это:

ByteArrayInputStream bais = new ByteArrayInputStream(propertiesString.getBytes("UTF-8"));
properties.load(bais);
...