Java 8环境下无法从消息包中显示正确俄文文本
解决Java 8读取UTF-8编码俄文properties文件乱码问题
问题原因
Java 8及更早版本的ResourceBundle默认使用ISO-8859-1编码读取.properties文件,而你的messageBundle_ru_RU.properties采用UTF-8编码存储俄文内容,字节被错误解析后就会出现类似ВерÑиÑ的乱码。
解决方案
通过自定义ResourceBundle.Control类,强制使用UTF-8编码读取properties文件,具体步骤如下:
1. 实现UTF-8编码的ResourceBundle.Control
创建自定义Control类,重写newBundle方法指定UTF-8编码:
import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.nio.charset.StandardCharsets; import java.util.Locale; import java.util.ResourceBundle; import java.util.PropertyResourceBundle; public class UTF8ResourceBundleControl extends ResourceBundle.Control { @Override public ResourceBundle newBundle(String baseName, Locale locale, String format, ClassLoader loader, boolean reload) throws IllegalAccessException, InstantiationException, IOException { String bundleName = toBundleName(baseName, locale); String resourceName = toResourceName(bundleName, "properties"); InputStream stream = reload ? getReloadableStream(loader, resourceName) : loader.getResourceAsStream(resourceName); if (stream == null) { return super.newBundle(baseName, locale, format, loader, reload); } try (InputStreamReader reader = new InputStreamReader(stream, StandardCharsets.UTF_8)) { return new PropertyResourceBundle(reader); } } private InputStream getReloadableStream(ClassLoader loader, String resourceName) throws IOException { var url = loader.getResource(resourceName); if (url == null) return null; var connection = url.openConnection(); connection.setUseCaches(false); return connection.getInputStream(); } }
2. 使用自定义Control初始化ResourceBundle
修改resMessagesBundle的初始化代码,传入自定义的Control:
import java.util.Locale; import java.util.ResourceBundle; // 初始化资源包 resMessagesBundle = ResourceBundle.getBundle( "messageBundle", new Locale("ru", "RU"), new UTF8ResourceBundleControl() ); // 读取方法保持不变 private static String getTranslateString(String key) { return resMessagesBundle.getString(key); }
3. IntelliJ IDEA编码设置调整
确保IDEA不会自动转义UTF-8内容:
- 打开
Settings->Editor->File Encodings - 将
Properties Files (*.properties)的Default encoding for properties files设置为UTF-8 - 取消勾选
Transparent native-to-ascii conversion(避免IDEA把俄文自动转成Unicode转义字符)
验证
完成上述配置后,再次调用getTranslateString方法,就能正确获取俄文内容,不会出现乱码。
内容的提问来源于stack exchange,提问作者Alexei
相关产品推荐
相关产品推荐

