Символ евро не отображается должным образом из файла свойств

Я читаю файл свойств, содержащий символ евро. когда он печатается на экране, который выглядит совершенно иначе. Я сравнил строку из файла реквизита и, объявив другую строку с тем же текстом, используя метод equals, она является ложной. Пожалуйста, может кто-нибудь мне помочь.

properities file
your purchase order is €

string text="your purchase order is €";

on comparing the above strings it fails.

************************
public String getProperty(String arg0) {
        Properties prop = new Properties();
        InputStream input = null;


            try {
                input = new FileInputStream("C:/text.properties");

            } catch (FileNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            try {

                prop.load(input);

            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        return prop.getProperty(arg0);

    }

person gavask    schedule 29.08.2014    source источник
comment
как это отображается?   -  person Olimpiu POP    schedule 29.08.2014
comment
Куда вы его выводите? Консоль IDE? Оболочка ?   -  person ortis    schedule 29.08.2014


Ответы (1)


Метод Properties.load, который принимает InputStream, предполагает, что файл сохранен в кодировке символов ISO-8859-1, которая не может представлять символ евро напрямую. Если файл действительно имеет другую кодировку, например UTF-8, вам следует использовать метод load, который вместо этого принимает Reader, и использовать InputStreamReader для указания правильной кодировки.

В качестве альтернативы файлы Properties поддерживают escape-последовательности Unicode, поэтому вы можете представить знак евро как \u20ac в файле, и он будет декодирован в реальный символ при загрузке файла.

Помимо этого, в вашем текущем коде есть ряд недостатков, наиболее важно то, что вам нужно убедиться, что входной поток должным образом закрыт после того, как вы загрузили из него свойства. Самый простой способ сделать это - использовать синтаксис «попробуйте с ресурсами».

try(InputStream in = new FileInputStream("C:/text.properties");
    InputStreamReader reader = new InputStreamReader(in, "UTF-8")) {
  prop.load(reader);
} catch (IOException e) {
  e.printStackTrace();
}

И кажется расточительным повторно загружать файл свойств каждый раз, когда вы запрашиваете у него значение, вы можете подумать о его загрузке только один раз (либо заранее, либо при первом запросе) и кешировании объекта Properties для последующего использования.

person Ian Roberts    schedule 29.08.2014