Как использовать UTF-8 в свойствах ресурса с ResourceBundle - PullRequest
239 голосов
/ 11 января 2011

Мне нужно использовать UTF-8 в свойствах моего ресурса, используя Java ResourceBundle.Когда я ввожу текст непосредственно в файл свойств, он отображается как mojibake.

Мое приложение работает на Google App Engine.

Может кто-нибудь привести пример?Я не могу получить эту работу.

Ответы [ 15 ]

2 голосов
/ 30 сентября 2015

Как было предложено, я прошел реализацию пакета ресурсов ... но это не помогло ... так как пакет всегда вызывался в en_US locale ... я пытался установить свой язык по умолчанию на другой язык, и все же моя реализацияуправления пакетами ресурсов вызывалось с помощью en_US ... я попытался поместить сообщения журнала и выполнить пошаговую отладку и посмотреть, был ли сделан другой локальный вызов после того, как я изменил локаль во время выполнения через вызовы xhtml и JSF ... чтоне случилось ... тогда я попытался сделать системный набор по умолчанию для utf8 для чтения файлов моим сервером (tomcat server) .. но это вызвало pronlem, так как все мои библиотеки классов не были скомпилированы под utf8 и tomcat начал читать тогдав формате utf8 и сервер не работал должным образом ... тогда я закончил с реализацией метода в моем контроллере Java для вызова из файлов xhtml .. в этом методе я сделал следующее:

        public String message(String key, boolean toUTF8) throws Throwable{
            String result = "";
            try{
                FacesContext context = FacesContext.getCurrentInstance();
                String message = context.getApplication().getResourceBundle(context, "messages").getString(key);

                result = message==null ? "" : toUTF8 ? new String(message.getBytes("iso8859-1"), "utf-8") : message;
            }catch(Throwable t){}
            return result;
        }

Iбыл особенно нервным, так как это может замедлить работу моего приложения ... однако,после реализации это выглядит так, как будто мое приложение теперь работает быстрее ... я думаю, что это потому, что я сейчас непосредственно обращаюсь к свойствам вместо того, чтобы позволить JSF разобраться в доступе к свойствам ... я специально передаю логический аргумент в этом вызовепотому что я знаю, что некоторые свойства не будут переведены и не должны быть в формате utf8 ...

Теперь я сохранил свой файл свойств в формате UTF8, и он отлично работает, как каждый пользователь в моем приложенииимеет референтный языковой стандарт.

1 голос
Properties prop = new Properties();
String fileName = "./src/test/resources/predefined.properties";
FileInputStream inputStream = new FileInputStream(fileName);
InputStreamReader reader = new InputStreamReader(inputStream,"UTF-8");
1 голос
/ 02 декабря 2014

Для меня стоило того, что сами файлы были в неправильной кодировке.Использование iconv у меня сработало

iconv -f ISO-8859-15 -t UTF-8  messages_nl.properties > messages_nl.properties.new
0 голосов
/ 12 апреля 2018

Откройте диалоговое окно «Настройки / Настройки» ( Ctrl + Alt + S ), затем щелкните Редактор и Кодировки файлов.

Screenshot of window shown

Затем, внизу, вы найдете кодировки по умолчанию для файлов свойств. Выберите тип кодировки.

В качестве альтернативы вы можете использовать символы юникода вместо текста в вашем наборе ресурсов (например, "ів" равно \u0456\u0432)

0 голосов
/ 05 мая 2016

Я пытался использовать подход, предложенный Родом, но, учитывая беспокойство BalusC о том, чтобы не повторять один и тот же обходной путь во всех приложениях, пришел с этим классом:

import java.io.UnsupportedEncodingException;
import java.util.Locale;
import java.util.ResourceBundle;

public class MyResourceBundle {

    // feature variables
    private ResourceBundle bundle;
    private String fileEncoding;

    public MyResourceBundle(Locale locale, String fileEncoding){
        this.bundle = ResourceBundle.getBundle("com.app.Bundle", locale);
        this.fileEncoding = fileEncoding;
    }

    public MyResourceBundle(Locale locale){
        this(locale, "UTF-8");
    }

    public String getString(String key){
        String value = bundle.getString(key); 
        try {
            return new String(value.getBytes("ISO-8859-1"), fileEncoding);
        } catch (UnsupportedEncodingException e) {
            return value;
        }
    }
}

Способ использованияэто будет очень похоже на обычное использование ResourceBundle:

private MyResourceBundle labels = new MyResourceBundle("es", "UTF-8");
String label = labels.getString(key)

Или вы можете использовать альтернативный конструктор, который по умолчанию использует UTF-8:

private MyResourceBundle labels = new MyResourceBundle("es");
...