【问题标题】:Apache's FileHandler saves unicode escapes instead of special charsApache 的 FileHandler 保存 unicode 转义而不是特殊字符
【发布时间】:2018-09-29 18:27:57
【问题描述】:

我一直在使用 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

【问题讨论】:

    标签: java apache configuration-files unicode-escapes


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-04-28
      • 2013-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多