带有重音字符的 Java 属性文件

Posted

技术标签:

【中文标题】带有重音字符的 Java 属性文件【英文标题】:Java Properties File with accented characters 【发布时间】:2015-02-06 10:33:59 【问题描述】:

我正在尝试从文本文件加载属性,但重音字符 (saül) 采用不同于 UTF-8 的编码,如何避免?

我的属性文件有一个带有重音字符 (saül) 的属性。当我远程调试时,我发现 properties.load(bufferedReader); 将其视为 saül 所以当我写入另一个文件时,它会被写入 saül,我在应用程序的其他任何地方都有 UTF-8 编码。从文件中读取属性时,我不确定自己做错了什么。

try 
    final String propertyFilePath = System.getProperty(JVM_ARGUMENT_NAME);
    if (StringUtils.hasText(propertyFilePath)) 
        setLocalOverride(true);
        resource = getApplicationContext().getResource(propertyFilePath);
        BufferedReader bufferedReader =
            new BufferedReader(new InputStreamReader(new FileInputStream(propertyFilePath), "UTF8"));
        properties.load(bufferedReader);
        externalFilePasswordConfigurer.afterPasswordPropertiesSet(properties);
        LOGGER.info("ExternalFilePropertyConfigurer UTF-8 Reader");
    
    setProperties(properties);
    logProperties(properties);
 catch (Exception e) 
    LOGGER.error("ExternalFilePropertyConfigurer setter failed to set properties: ", e);
    throw new RuntimeException(e);

【问题讨论】:

How to use UTF-8 in resource properties with ResourceBundle 的可能重复项 我不认为这是重复的(ResourceBundle vs Properties)。 也就是说,我不确定我是否理解这个问题。如果属性文件使用的是非 UTF-8 编码,那么对 InputStreamReader 使用不同的参数? 同意@bkail。应该更改 InputStreamReader 的字符编码参数。 大家好,感谢 cmets,我的属性文件有一个带有重音字符 (saül) 的属性。但是,当我进行远程调试时,我发现 properties.load(bufferedReader); 将其视为 saül,因此当我写入另一个文件时,它被写入为 saül,我在其他任何地方都有 UTF-8 编码应用。从文件中读取属性时,我不确定自己做错了什么。 【参考方案1】:

老问题,但据我所知,任何 .properties 文件都必须采用 ISO-8859-1 字符集,否则会有麻烦。

当属性文件中需要重音字符时,必须将每个字符替换为其 unicode 版本。在这种特殊情况下,“saül”必须更改为"sa\u00FCl",其中\u00FC"ü"

另一种解决方案是将文件类型从 .properties 更改为 .xml

See java documentation here:

load(Reader) / store(Writer, String) 方法加载和存储 一个简单的基于字符的流的属性 下面指定的面向行的格式。负载(输入流)/ store(OutputStream, String) 方法的工作方式与 load(Reader)/store(Writer, String) 对,除了输入/输出 流以 ISO 8859-1 字符编码编码。字符 不能直接用这种编码表示可以写成 The Java™ Language 3.3 节中定义的 Unicode 转义 规格;转义中只允许使用一个 'u' 字符 顺序。 native2ascii 工具可用于转换属性文件 往返于其他字符编码。

【讨论】:

【参考方案2】:

我知道这个问题很老,但我遇到了同样的问题,不想将重音字符更改为其 unicode 编码版本。

所以我在我的 pom.xml 中添加了以下插件

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>native2ascii-maven-plugin</artifactId>
    <version>2.0.1</version>
    <executions>
            <execution>
                    <goals>
                            <goal>resources</goal>
                    </goals>
                    <phase>process-resources</phase>
                    <configuration>
                            <srcDir>src/main/resources</srcDir>
                            <targetDir>$project.build.outputDirectory</targetDir>
                            <encoding>$project.build.sourceEncoding</encoding>
                            <includes>
                                    <include>message.properties</include>
                            </includes>
                    </configuration>
            </execution>
    </executions>
</plugin>

您可以在此处阅读有关该插件的更多信息 https://github.com/mojohaus/native2ascii-maven-plugin

【讨论】:

以上是关于带有重音字符的 Java 属性文件的主要内容,如果未能解决你的问题,请参考以下文章

在带有重音字母的语言中转义 HTML

Java 删除字符串上的标点符号(也包括“”和所有这些)维护重音字符

使用带有无效字符的 Net::FTP gettextfile (ASCII-8BIT vs UTF-8)

带有重音的xcode sql字符已更改

带有重音/拉丁字符的 JSON 请求

带有重音符号的 XML 字符编码问题