You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 16:36:06