UTF-8 в ResourceBundle Java: решение для Google App Engine
Быстрый ответ
Для использования кодировки UTF-8 в файлах свойств рекомендуется написать собственную реализацию ResourceBundle.Control
и переопределить в ней метод newBundle
. Этот метод должен создавать объект PropertyResourceBundle
, используя InputStreamReader
с указанной кодировкой UTF-8.
Пример кода:
public class UTF8Control extends ResourceBundle.Control {
@Override
public ResourceBundle newBundle(String baseName, Locale locale, String format,
ClassLoader loader, boolean reload)
throws IOException {
String bundleName = toBundleName(baseName, locale);
String resourceName = toResourceName(bundleName, "properties");
try (InputStream is = loader.getResourceAsStream(resourceName);
Reader reader = new InputStreamReader(is, StandardCharsets.UTF_8)) {
return new PropertyResourceBundle(reader);
}
}
}
ResourceBundle bundle = ResourceBundle.getBundle("BundleName", new UTF8Control());
Созданный класс UTF8Control
гарантирует корректную загрузку файлов с учётом кодировки UTF-8
, что позволяет избежать проблем, связанных с неправильной кодировкой.
Стратегии работы с кодировками свойств в различных IDE
Кодировка в IntelliJ IDEA
Для выбора кодировки UTF-8 в файлах свойств в IntelliJ IDEA нужно зайти в File
→ Settings
→ Editor
→ File Encodings
и в соответствующих полях установить как Глобальную Кодировку, так и Кодировку Проекта в UTF-8. Данная настройка позволит IDE автоматически конвертировать символы, не входящие в ASCII, в формат \uXXXX
.
Обходное решение для Eclipse
Поскольку Eclipse по умолчанию работает с кодировкой ISO-8859-1, можно либо изменить настройки кодировки рабочей области на UTF-8, либо использовать утилиту native2ascii
для конвертации файлов в Unicode.
Универсальное решение: использование текстовых редакторов
Если работа с IDE вызывает трудности, вы можете пользоваться универсальными текстовыми редакторами, как, например, Sublime Text или Visual Studio Code, которые умеют корректно работать с различными кодировками.
Соблюдение совместимости со старыми версиями Java
Хорошие новости для пользователей Java 9 и новее
Начиная с версии Java 9, ResourceBundle
поддерживает кодировку UTF-8 по умолчанию, что позволяет избежать проблем с кодировкой файлов свойств.
Обходное решение для старых версий Java
В версиях Java до 8-й необходимо сохранять файлы в кодировке ISO-8859-1, либо использовать описанный ранее UTF8Control
. Также возможно применять экранированные коды вида \uXXXX
для символов, которые не входят в диапазон кодировки ISO.
Методика работы с InputStreamReader
Если текст отображается некорректно, попробуйте загрузить файлы свойств с использованием InputStreamReader
, настроенного на кодировку UTF-8.
Обеспечение совместимости с существующим окружением
Google App Engine: что стоит учесть
При работе на платформе Google App Engine (GAE) необходимо учитывать установленные ограничения на работу с кодировками ресурсов.
Настройки IDE: друг или враг?
Проблемы с кодировкой зачастую возникают из-за неправильной настройки среды разработки. Изучите руководство по работе с вашей IDE и настройте её таким образом, чтобы избежать ненужных ошибок и проблем.
Инструменты на помощь: native2ascii
Если проблемы с кодировкой UTF-8 всё ещё актуальны, попробуйте использовать утилиту native2ascii
для конвертации файлов свойств в ISO-8859-1. Это поможет избежать возможных проблем при интерпретации символов.
Эффективные стратегии работы с кодировкой UTF-8
Расширенная загрузка свойств
До появления версии Java 9 рекомендуется использовать InputStream
и PropertyResourceBundle
для гибкого управления кодировками свойств.
Умелый приём для конвертации кодировок
Если строка считывается некорректно, вы можете применить конструкцию new String(bytes, "UTF-8")
, которая перекодирует ISO-8859-1 в UTF-8 и упрощает работу с символами.
Ввод символов вручную: лучше перестраховаться!
Наиболее разумным решением будет избегание ручного ввода не-ASCII символов. Вместо этого можно использовать экранированные символы или обеспечить совместимость используемого редактора с кодировкой UTF-8. Это позволит избежать возможных проблем с интерпретацией символов.
Визуализация
Правильное использование ResourceBundle
с кодировкой UTF-8 можно сравнить с разницей между гурманским кофе ☕ и горьким чаем 🍵. Каждый параметр (поведение свойства) настраивается так, чтобы выполнять свою функцию (обеспечивать вкус) независимо от языка или локации пользователя (места происхождения).
Полезные материалы
- ResourceBundle (Java Platform SE 8)
- Дополнительные символы на платформе Java
- java – Использование кодировки UTF-8 в ресурсных файлах свойств с ResourceBundle – Stack Overflow
- Подключение ResourceBundle к файлам свойств (Туториалы Java™ > Интернационализация > Изолирование локально-специфических данных)
- Интернационализация: Понимание локалей на платформе Java
- utf 8 – Установка стандартной кодировки символов в Java – Stack Overflow