JDK 1.5 Свойства загружаются с символами Юникода

Метод загрузки свойств JDK 1.5 получает только InputStream, а метод загрузки JDK 1.6+ также получает Reader. Когда строка с символами Unicode загружается в объект свойств в JDK 1.6+ с load(reader), проблем не возникает. Но в JDK 1.5 есть только метод load(InputStream); при загрузке в свойства символы юникода загружаются неправильно.

Properties props = new Properties();
ByteArrayInputStream bis = null;
Reader reader = null;
try {
        bis = new ByteArrayInputStream(someStringWithUnicodeChars.getBytes("UTF-8"));
        reader = new InputStreamReader(bis, "UTF-8");
    } catch (UnsupportedEncodingException ex) {
        ex.printStackTrace();
    }

props.load(reader); // This reads unicode characters correctly on JDK 1.6+

// There is no props.load(reader) method on JDK 1.5, so below method is used
props.load(bis);
// but Unicode characters are not loaded correctly.

Как я могу загрузить следующую строку примера с символами Юникода в объект свойств.

key1=test İ Ş Ğ
key2=ÇÇÇÇ

2 ответа

Из javadoc 1.5 "Предполагается, что поток использует кодировку ISO 8859-1" http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Properties.html

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

InputStream in = new ByteArrayInputStream(someStringWithUnicodeChars.getBytes("ISO-8859-1"));
Properties props = new Properties();
props.load(in);

Поэтому в JDK существует инструмент native2ascii[.exe].

1) create the properties file as UTF-8, name it for example: sample.native
2) convert the native properties file to Unicode escape sequences: native2ascii prop.native > prop.properties
3) load and process the properties file

// example: you will see the right UTF-8 characters only if your console suppert UTF-8
class PropsFile {
    public static void main(String[] args) throws Exception {
        try (FileInputStream fis = new FileInputStream("sample.properties")) {
            Properties props = new Properties();
            props.load(fis);
            for (String name : props.stringPropertyNames()) {
                System.out.println(name + "=" + props.getProperty(name));
            }
        }
    }
}
Другие вопросы по тегам