【问题标题】:Java Properties File with accented characters带有重音字符的 Java 属性文件
【发布时间】: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);
}

【问题讨论】:

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

标签: java spring utf-8 properties-file


【解决方案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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-25
      • 2021-01-28
      • 1970-01-01
      • 2017-12-31
      相关资源
      最近更新 更多