带有重音字符的 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 属性文件的主要内容,如果未能解决你的问题,请参考以下文章
Java 删除字符串上的标点符号(也包括“”和所有这些)维护重音字符