捷克语 MessageResource.getMessage() 的 Spring ResourceBundleMessageSource 编码

标签 spring properties character-encoding locale resourcebundle

我有一个转换器,它使用 ResourceBundleMessageSource 读取多个语言环境的 .properties 文件中的属性,例如 en_US、fr_FR、cs_CZ

下面是读取属性的 xml。

<bean id="messageSource"
    class="org.springframework.context.support.ResourceBundleMessageSource">
    <property name="basenames">
    <list>
            <value>lang/beneficiaryproperty/beneficiary</value>
            <value>lang/labelsbundlesproperty/labelsbundle</value>
    </list>
    </property>
</bean>

下面是在java中使用File API读写javascript文件的代码。

String localeAr[]= lang.split("_");
Locale currentLocale = new Locale(localeAr[0].trim(),localeAr[1].trim());
file = new File(outputPath +file.separator+ jsFilename + "_" + lang + ".js");
System.out.println(file.getAbsolutePath());
System.out.println();
file.createNewFile();
buffer.append(disclaimerDetails);
buffer.append("var " + var + " = \n");
buffer.append("{ \n");

Iterator iterator = tplPropObj.keySet().iterator();
while (iterator.hasNext()) 
{
    String key = (String) iterator.next();

        System.out.println("Key : "+key+" -  Label : "+tplPropObj.getProperty(key)+"  -  Locale : "+currentLocale);

        String value = messageSource.getMessage(tplPropObj.getProperty(key), new Object[] { }, currentLocale);

        System.out.println( "- Value : "+value);

        buffer.append("\t" + "\"" + key + "\": ");
        buffer.append("\"" + value + "\"");

        if (iterator.hasNext()) 
        {
            buffer.append(",");
        }
    buffer.append("\n");
}   
buffer.append("} ");

        if(localeAr[1].equalsIgnoreCase("PL") || localeAr[1].equalsIgnoreCase("CZ"))
        {
            Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), "UTF-8"));
            out.write(buffer.toString());
            out.flush();
            out.close();
            buffer.delete(0, buffer.length());
        }
        else
        {
            System.setProperty("file.encoding", "ISO-8859-1");
            BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(file));
            bufferedWriter.write(buffer.toString());
            bufferedWriter.flush();
            bufferedWriter.close();
            buffer.delete(0, buffer.length());
        }

String value = messageSource.getMessage(tplPropObj.getProperty(key), new Object[] { }, currentLocale);

上面的特定行从具有 cs_CZ 本地的文件中读取属性(文件名

beneficiary_cs_CZ.properties

以下是 beneficiary_cs_CZ.properties 文件的内容。这些内容使用 UTF-8 编码 For czech_language 保存在 STS 中

lbl.beneficiary.name=Z technických důvodů zavřeno.
lbl.beneficiary.number=123456 
lbl.beneficiary.loc=Prosím vás, kde je
divadlo lbl.beneficiary.owner=Mã Người Ký Phát

到此为止就OK了。但是当我从消息资源对象中读取这些值时,它返回不同的值 以下是从 MessageSource 对象生成的值。

-

Key : Beneficiary.Name - Label : lbl.beneficiary.name - Locale : cs_CZ Value : Z technických důvodů zavÅ?eno.

Key : Beneficiary.Number - Label : lbl.beneficiary.number - Locale : cs_CZ - Value : 123456

Key : Beneficiary.Owner - Label : lbl.beneficiary.owner - Locale : cs_CZ - Value : Mã Ngư�i Ký Phát

如果我使用语言环境从 MessageResouce 读取值,我不明白为什么会发生这种情况。

任何帮助..感谢。

最佳答案

M。 Deinum 是对的,您不应该对 Java 属性文件使用 UTF-8 文件编码。 (这在 Java9 中已更改,请参阅 PowerStat 的注释。) 相反,您应该在该文件中使用 utf8 字符的转义序列。 (https://stackoverflow.com/a/4660058/280244)

但是(我不推荐这样做)您可以在 Spring 中使用 UTF8 编码消息文件。关键是需要配置MessageResource

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

关于捷克语 MessageResource.getMessage() 的 Spring ResourceBundleMessageSource 编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34264371/

相关文章:

spring - 将 hibernate 命名策略设置为 Spring bean

java - 限制哪些值可以在 javafx 属性中结算?

java - SoapUI 无法正确打印多字节字符

Python 和 MySQL 不正确的字符串值

java - Hibernate 中的重复条目

java - 为什么 Spring Cloud Consul 不能与独立的 Tomcat 一起使用?

spring - 构建后、部署前的属性文件配置

grails - 在Web流中使用Grails属性表达式而不是域对象?

c++ - 任何 Microsoft 库都使用 Windows SBCS 代码页中的非拉丁数字来表示 C 字符串中的数字数据吗?

Spring Controller 方法执行两次