Не латинские символы отображаются как '?' - PullRequest
0 голосов
/ 04 марта 2019

У меня есть свойство, подобное name.label=名

Мой код Java похож на

Properties properties = new Properties();
try (FileInputStream inputStream = new FileInputStream(path)) {
    Reader reader = new InputStreamReader(inputStream, Charset.forName("UTF-8"));
    properties.load(reader);
    System.out.println("Name label: " + properties.getProperty("name.label"));
    reader.close();
} catch (FileNotFoundException e) {
    log.debug("Couldn't find properties file. ", e);
} catch (IOException e) {
    log.debug("Couldn't close input stream. ", e);
}

, но оно печатает

Имя метки:?

Я использую Java 8.

1 Ответ

0 голосов
/ 05 марта 2019

Символ замены может указывать на то, что файл не закодирован с указанным CharSet.

В зависимости от того, как вы сконструируете читатель, вы получите другое поведение по умолчанию в отношении искаженного ввода.

Когда вы используете

Properties properties = new Properties();
try(FileInputStream inputStream = new FileInputStream(path);
    Reader reader = new InputStreamReader(inputStream, StandardCharsets.UTF_8)) {

    properties.load(reader);
    System.out.println("Name label: " + properties.getProperty("name.label"));
} catch(FileNotFoundException e) {
    log.debug("Couldn't find properties file. ", e);
} catch(IOException e) {
    log.debug("Couldn't read properties file. ", e);
}

, вы получаете Reader с CharsetDecoder, настроенным для замены неверного ввода.Напротив, когда вы используете

Properties properties = new Properties();
try(Reader reader = Files.newBufferedReader(Paths.get(path))) { // default to UTF-8
    properties.load(reader);
    System.out.println("Name label: " + properties.getProperty("name.label"));
} catch(FileNotFoundException e) {
    log.debug("Couldn't find properties file. ", e);
} catch(IOException e) {
    log.debug("Couldn't read properties file. ", e);
}

, CharsetDecoder будет настроен на выдачу исключения на некорректный ввод.

Для полноты, вот как вы можете настроить поведение, если ни один из них не подходит по умолчаниюВаши потребности:

Properties properties = new Properties();
CharsetDecoder dec = StandardCharsets.UTF_8.newDecoder()
    .onMalformedInput(CodingErrorAction.REPLACE)
    .replaceWith("!");
try(FileInputStream inputStream = new FileInputStream(path);
    Reader reader = new InputStreamReader(inputStream, dec)) {

    properties.load(reader);
    System.out.println("Name label: " + properties.getProperty("name.label"));
} catch(FileNotFoundException e) {
    log.debug("Couldn't find properties file. ", e);
} catch(IOException e) {
    log.debug("Couldn't read properties file. ", e);
}

См. также CharsetDecoder и CodingErrorAction.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...