Apache的FileHandler保存unicode转义而不是特殊字符

时间:2018-04-19 09:47:04

标签: java apache configuration-files unicode-escapes

我一直在使用Apache Commons Configuration2来管理属性文件。问题是,在将配置保存到文件时,特殊字符将替换为其Java源代码;与a=Rumänien -> a=Rum\u00E4nien中一样。

有什么方法可以避免这种情况吗?最好使用FileHandlers或类似的Writers / Streams,因为我无法使用Apache提供的Builder。

正确执行读数。如果我设置断点,我可以看到存储的正确值,但是,只要我想保持配置,我就会得到那种结果。

这是一个MCVE,请注意您需要链接以下Apache库:

  • Configuration2
  • Logging
  • Lang

    public static void main(final String[] args) {
        final String inputPath = "C:\\yourFullPath\\properties_in.cfg";
        final String outputPath = "C:\\yourFullPath\\properties_out.cfg";
    
        final PropertiesConfiguration config = new PropertiesConfiguration();
    
        try {
            // Load the config
            final FileHandler inputHandler = new FileHandler(config);
            inputHandler.setEncoding("UTF-8");
            inputHandler.setPath(inputPath);
    
            inputHandler.load();
    
            // Save the config in a different file
            final FileHandler outputHandler = new FileHandler(config);
            outputHandler.setEncoding("UTF-8");
            outputHandler.setPath(outputPath);
    
            outputHandler.save();
        } catch (final Exception e) {
            e.printStackTrace();
        }
    }
    

运行代码前后properties_in.cfg的内容为a=Rumänien

运行代码之前

properties_out.cfg不存在,执行完成后其内容为a=Rum\u00E4nien

1 个答案:

答案 0 :(得分:2)

原因是,Java的属性文件的严格定义要求它们采用ISO-8859-1编码,并且不在其中的所有Unicode字符都将使用\uXXXX转义编码。所以技术上说出一切都按照规定运作。

如果库允许它(可能带有custom writer),你可以破解它编写UTF-8而不执行转义。