В ResourceBundle#getBundle()
використання під ковдрою , PropertyResourceBundle
коли .properties
в зазначений файл. Це, в свою чергу, використовує за замовчуванням Properties#load(InputStream)
для завантаження файлів цих властивостей. Відповідно до javadoc , вони за замовчуванням читаються як ISO-8859-1.
public void load(InputStream inStream) throws IOException
Читає список властивостей (пари ключів та елементів) з потоку вхідних байтів. Вхідний потік у простому лінійно-орієнтованому форматі, як зазначено в завантаженні (Reader), і передбачається використовувати кодування символів ISO 8859-1 ; тобто кожен байт є одним символом Latin1. Символи, що не є латинським1, та певні спеціальні символи, представлені ключами та елементами, що використовують уникнення Unicode, як визначено в розділі 3.3 Спеціалізації мови Java ™.
Отже, вам потрібно буде зберегти їх як ISO-8859-1. Якщо у вас є будь-які символи, що перебувають за межами діапазону ISO-8859-1, і ви не можете використовувати \uXXXX
верхню частину голови, і, таким чином, ви змушені зберегти файл як UTF-8, тоді вам потрібно буде використовувати інструмент native2ascii для перетворення Файл збережених властивостей UTF-8 у файл збережених властивостей ISO-8859-1, де всі непокриті символи перетворюються у \uXXXX
формат. Наведений нижче приклад перетворює закодований файл властивостей UTF-8 text_utf8.properties
у допустимий закодований файл властивостей ISO-8859-1 text.properties
.
native2ascii -кодування UTF-8 text_utf8.properties text.properties
При використанні здорового IDE, такого як Eclipse, це вже робиться автоматично, коли ви створюєте .properties
файл у проекті на базі Java та використовуєте власний редактор Eclipse. Eclipse прозоро перетворить символи за межі діапазону ISO-8859-1 у \uXXXX
формат. Дивіться також нижче скріншоти (зверніть увагу на вкладки "Властивості" та "Джерело" внизу, натисніть для великих):
Крім того, ви також можете створити власну ResourceBundle.Control
реалізацію, в якій ви явно читаєте файли властивостей як UTF-8 за допомогою InputStreamReader
, так що ви можете просто зберегти їх як UTF-8 без зайвих проблем native2ascii
. Ось приклад відмови:
public class UTF8Control extends Control {
public ResourceBundle newBundle
(String baseName, Locale locale, String format, ClassLoader loader, boolean reload)
throws IllegalAccessException, InstantiationException, IOException
{
// The below is a copy of the default implementation.
String bundleName = toBundleName(baseName, locale);
String resourceName = toResourceName(bundleName, "properties");
ResourceBundle bundle = null;
InputStream stream = null;
if (reload) {
URL url = loader.getResource(resourceName);
if (url != null) {
URLConnection connection = url.openConnection();
if (connection != null) {
connection.setUseCaches(false);
stream = connection.getInputStream();
}
}
} else {
stream = loader.getResourceAsStream(resourceName);
}
if (stream != null) {
try {
// Only this line is changed to make it to read properties files as UTF-8.
bundle = new PropertyResourceBundle(new InputStreamReader(stream, "UTF-8"));
} finally {
stream.close();
}
}
return bundle;
}
}
Це можна використовувати так:
ResourceBundle bundle = ResourceBundle.getBundle("com.example.i18n.text", new UTF8Control());
Дивитися також: