如何在资源属性中使用 UTF-8 和资源捆绑包Java 9 及更高版本Java 8 及更早版本
我需要使用Java的资源属性使用UTF-8。当我将文本直接输入到属性文件中时,它显示为mojibake。ResourceBundle
我的应用在 Google App Engine 上运行。
任何人都可以给我举个例子吗?我无法获得这项工作。
我需要使用Java的资源属性使用UTF-8。当我将文本直接输入到属性文件中时,它显示为mojibake。ResourceBundle
我的应用在 Google App Engine 上运行。
任何人都可以给我举个例子吗?我无法获得这项工作。
从 Java 9 开始,默认情况下,属性文件被编码为 UTF-8,使用 ISO-8859-1 以外的字符应该可以开箱即用。
ResourceBundle#getBundle()
在指定文件时使用 PropertyResourceBundle
。这反过来又使用默认的属性#load(InputStream)
来加载这些属性文件。根据javadoc,它们默认读取为ISO-8859-1。.properties
public void load(InputStream inStream) throws IOException
从输入字节流中读取属性列表(键和元素对)。输入流采用 load(Reader) 中指定的简单面向行的格式,并假定使用 ISO 8859-1 字符编码;即每个字节是一个拉丁字符1。非拉丁语字符1 和某些特殊字符使用 Java™ 语言规范第 3.3 节中定义的 Unicode 转义在键和元素中表示。
因此,您需要将它们另存为ISO-8859-1。如果您有任何超出ISO-8859-1范围的字符,并且您无法使用头顶,因此被迫将文件另存为UTF-8,则需要使用native2ascii工具将UTF-8保存的属性文件转换为ISO-8859-1保存的属性文件,其中所有未覆盖的字符都转换为格式。下面的示例将 UTF-8 编码的属性文件转换为有效的 ISO-8859-1 编码属性文件。\uXXXX
\uXXXX
text_utf8.properties
text.properties
native2ascii -encoding UTF-8 text_utf8.properties text.properties
当使用像 Eclipse 这样的 sane IDE 时,当您在基于 Java 的项目中创建文件并使用 Eclipse 自己的编辑器时,这已经自动完成。Eclipse 会将超出 ISO-8859-1 范围的字符透明地转换为格式。另请参阅下面的屏幕截图(请注意底部的“属性”和“源”选项卡,单击查看大号):.properties
\uXXXX
或者,您也可以创建自定义 ResourceBundle.Control
实现,其中使用 InputStreamReader
将属性文件显式读取为 UTF-8,以便您只需将它们另存为 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());
假设您有一个 ResourceBundle 实例,并且您可以通过以下方式获取 String:
String val = bundle.getString(key);
我通过以下方式解决了我的日语显示问题:
return new String(val.getBytes("ISO-8859-1"), "UTF-8");