解决 i18n properties文件中文必须是unicode的问题

摘要:
为了解决i18nproperties文件的中文必须是unicode的问题,i18nunicodeUTF-8当前需要国际化,但Java I18N资源文件的中文需要转换为unicode。虽然没有问题,但确实很不方便。通过检查ResourceBundler类的源代码,我们发现它的内部类Control在读取资源文件时使用字节流而不是字符流。找到源代码问题。我们只需要重写Control类,并使用UTF-8读取器读取资源文件。详细的代码实现如下:packagecom.feshfans。春天importjava.io。IOException;importjava.io。输入流;importjava.io。InputStreamReader;导入java.net。URL;导入java.net。URL连接;importjava.security。访问控制器;importjava.security。PrivilegedActionException;importjava.security。PrivilegeExceptionAction;导入java.util。场所导入java.util。PropertyResourceBundle;导入java.util。资源捆绑包;/***描述:*CleanUsercom.feshfans。春季*feshfans2018/5/1118:46*电子邮件:feshfans@163.com**/publicclassUTF8ControlextendsResourceBundle。控件{@OverridepublicResourceBundlenewBundlethrowsIllegalAccessException、InstantiationException、IOException{StringbundleName=toBundleName;ResourceBundlebundle=null;如果{try{@SuppressWarningsClass<?
解决 i18n properties文件中文必须是unicode的问题
i18n  unicode  UTF-8 

目前产品需要做国际化,但 java 的 I18N 资源文件中中文必须转换成 unicode 才行。虽然并不会有问题,但实在是不方便,通过查看 ResourceBundler 类的源码,发现其内部类 Control 在读取资源文件时,使用的是字节流而非字符流。

源代码
源代码

问题找到了,我们只要重写 Control 类即可,使用 UTF-8 的 Reader 去读取资源文件即可。

详细代码实现如下:

package com.feshfans.spring;

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.security.AccessController;
import java.security.PrivilegedActionException;
import java.security.PrivilegedExceptionAction;
import java.util.Locale;
import java.util.PropertyResourceBundle;
import java.util.ResourceBundle;

/**
 * DESC:
 * CleanUser com.feshfans.spring
 * feshfans 2018/5/11 18:46
 * email: feshfans@163.com
 **/
public class UTF8Control 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);
        ResourceBundle bundle = null;
        if (format.equals("java.class")) {
            try {
                @SuppressWarnings("unchecked")
                Class<? extends ResourceBundle> bundleClass
                        = (Class<? extends ResourceBundle>)loader.loadClass(bundleName);

                // If the class isn't a ResourceBundle subclass, throw a
                // ClassCastException.
                if (ResourceBundle.class.isAssignableFrom(bundleClass)) {
                    bundle = bundleClass.newInstance();
                } else {
                    throw new ClassCastException(bundleClass.getName()
                            + " cannot be cast to ResourceBundle");
                }
            } catch (ClassNotFoundException e) {
            }
        } else if (format.equals("java.properties")) {
            final String resourceName = toResourceName0(bundleName, "properties");
            if (resourceName == null) {
                return bundle;
            }
            final ClassLoader classLoader = loader;
            final boolean reloadFlag = reload;
            InputStream stream = null;
            try {
                stream = AccessController.doPrivileged(
                        new PrivilegedExceptionAction<InputStream>() {
                            public InputStream run() throws IOException {
                                InputStream is = null;
                                if (reloadFlag) {
                                    URL url = classLoader.getResource(resourceName);
                                    if (url != null) {
                                        URLConnection connection = url.openConnection();
                                        if (connection != null) {
                                            // Disable caches to get fresh data for
                                            // reloading.
                                            connection.setUseCaches(false);
                                            is = connection.getInputStream();
                                        }
                                    }
                                } else {
                                    is = classLoader.getResourceAsStream(resourceName);
                                }
                                return is;
                            }
                        });
            } catch (PrivilegedActionException e) {
                throw (IOException) e.getException();
            }
            if (stream != null) {
                try {
                    bundle = new PropertyResourceBundle(new InputStreamReader(stream,"UTF-8"));
                } finally {
                    stream.close();
                }
            }
        } else {
            throw new IllegalArgumentException("unknown format: " + format);
        }
        return bundle;
    }

    private String toResourceName0(String bundleName, String suffix) {
        // application protocol check
        if (bundleName.contains("://")) {
            return null;
        } else {
            return toResourceName(bundleName, suffix);
        }
    }

    public static void main(String[] args) {
        ResourceBundle.getBundle("baseName",new UTF8Control());
    }

}


然后,在构建 ResourceBundler 时,使用以下方法即可:


ResourceBundle.getBundle("baseName",new UTF8Control());

免责声明:文章转载自《解决 i18n properties文件中文必须是unicode的问题》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇接口抓包测试工具Charlesvue源码实现的整体流程解析下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

jQuery之前端国际化jQuery.i18n.properties

jQuery.i18n.properties是一款轻量级的jQuery国际化插件,能实现Web前端的国际化。 国际化英文单词为:Internationalization,又称i18n,“i”为单词的第一个字母,“18”为“i”和“n”之间单词的个数,而“n”代表这个单词的最后一个字母。jQuery.i18n.properties采用.properties文...

Springcloud学习笔记38读取 .properties 配置文件的工具类PropertyUtils和@ConfigurationProperties读取yaml文件中配置的数据库连接池druid属性

1.读取 .properties 配置文件的工具类PropertyUtils 项目中经常将一些配置信息放到properties文件中,读取非常方便,下面介绍几种java读取properties配置文件的方式。先看示例的properties文件: 通过jdk提供的java.util.Properties类,基于ClassLoder读取配置文件,实现prop...

properties文件加载的六种方法

加载项目properties文件的六种方法,其中四种都是通过Properties类加载inputStream读取,后两种通过ResourcesBundle类和其子类来加载 /*** 通过inputStream加载配置文件到properties对象 */ private void getPropertiesByInputStream_On...

Java读取properties配置文件时,中文乱码解决方法

Java读取properties配置文件时,中文乱码解决方法 转自:http://pig345.iteye.com/blog/725974 碰到了用java.util.Properties读取中文内容(UTF-8格式)的配置文件,发生中文乱码的现象,   Java代码   Properties prop=new Properties(); ...

Java读取Properties配置文件

1.Properties类与Properties配置文件 Properties类继承自Hashtable类并且实现了Map接口,使用键值对的形式来保存属性集。不过Properties的键和值都是字符串类型。 2.Properties中的主要方法 (1)load(InputStream inStream) 此方法可以从.properties属性文件对应的文件...

Druid数据库连接池的使用

Druid阿里提供的数据库连接池,集以上连接池优点于一身,开发使用此连接池 使用配置文件方式获取Druid数据库连接池 TestDruid packagecom.aff.connection; importjava.io.InputStream; importjava.sql.Connection; importjava.util.Properties;...