在ReloadableResourceBundleMessageSource中setDefaultEncoding的功能是什么

时间:2016-01-31 17:14:03

标签: java spring-mvc utf-8 character-encoding properties-file

AFAIK,Spring的ResourceBundleMessageSource建立在标准J2SE java.util.ResourceBundlejava.util.Properties之上,它们无法处理ISO-8859-1以外的文件编码。 但在许多示例代码中,我看到了这一点:

ReloadableResourceBundleMessageSource resource = new ReloadableResourceBundleMessageSource();
resource.setBasename("classpath:messages");
resource.setDefaultEncoding("UTF-8");

resource.setDefaultEncoding("UTF-8");的功能是什么?这让我很困惑,任何人都能解释一下吗?

1 个答案:

答案 0 :(得分:1)

ReloadableResourceBundleMessageSource

中按如下方式加载属性
this.propertiesPersister.load(props, new InputStreamReader(is, encoding));

查看spring-context source code。在更进一步的课程中,文件通过java.util.Properties public void load(Reader reader)方法读取,该方法将编码识别InputStreamReader(is, encoding)作为参数。

这意味着常规java.util.Properties也可以加载不同的编码。

示例

PropertyReader.java

package com.example;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Locale;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class PropertyReader {

    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("context.xml");
        List<String> locales = new ArrayList<String>(Arrays.asList("en", "ru", "de"));
        for (String loc : locales) {
            Locale locale = new Locale(loc);
            String value = context.getMessage("example", null, locale);
            System.out.println(value);
        }
        ((AbstractApplicationContext) context).close();
    }
}

context.xml中

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
        <property name="basename">
            <value>messages</value>
        </property>
        <property name="defaultEncoding">
            <value>UTF-8</value>
        </property>
    </bean>

</beans>

messages.properties

example=Example

messages_de.properties

example=Beispiel

messages_ru.properties

example=образец

没有defaultEncoding的结果

在context.xml中注释属性

Example
обÑазеÑ
Beispiel

使用defaultEncoding的结果

Example
образец
Beispiel

程序化方法的结果相同。