You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Apache Commons Configuration2保存时转义特殊字符问题求助

解决Apache Commons Configuration2保存时特殊字符转Unicode的问题

我之前在使用Apache Commons Configuration2管理属性文件时,也碰到过一模一样的问题——保存时像Rumänien这类带特殊字符的内容会被转成Rum\u00E4nien,读取时没问题但保存后的文件可读性极差。不用Builder也能搞定,优先用你提到的FileHandler/Writer方案,具体操作如下:

核心原因

默认情况下,Apache Commons Configuration2的PropertiesWriter会沿用Java原生Properties类的行为:将非ASCII字符自动转义为Unicode格式。要解决这个问题,关键就是禁用这个转义逻辑,同时确保文件用UTF-8编码保存避免乱码。

方案1:用FileHandler自定义WriterFactory

如果你习惯用FileHandler管理配置文件,可以通过自定义WriterFactory来创建禁用Unicode转义的PropertiesWriter:

import org.apache.commons.configuration2.PropertiesConfiguration;
import org.apache.commons.configuration2.io.FileHandler;
import org.apache.commons.configuration2.io.WriterFactory;
import org.apache.commons.configuration2.PropertiesConfiguration.PropertiesWriter;

import java.io.*;
import java.nio.charset.StandardCharsets;

// 假设你已经初始化好配置对象
PropertiesConfiguration config = new PropertiesConfiguration();
config.setProperty("a", "Rumänien");

// 创建FileHandler并关联配置和目标文件
FileHandler handler = new FileHandler(config);
handler.setFile(new File("your-config.properties"));
// 确保读取/保存都用UTF-8编码
handler.setEncoding(StandardCharsets.UTF_8.name());

// 自定义WriterFactory,生成禁用Unicode转义的PropertiesWriter
handler.setWriterFactory(new WriterFactory() {
    @Override
    public Writer createWriter(OutputStream out) throws IOException {
        // 先创建UTF-8编码的OutputStreamWriter
        OutputStreamWriter osw = new OutputStreamWriter(out, StandardCharsets.UTF_8);
        // 第二个参数设为false,禁用Unicode转义
        return new PropertiesWriter(osw, false);
    }
});

// 执行保存
handler.save();

方案2:直接用PropertiesWriter写入

如果不想用FileHandler,也可以直接通过PropertiesWriter手动写入配置,同样禁用转义:

import org.apache.commons.configuration2.PropertiesConfiguration;
import org.apache.commons.configuration2.PropertiesConfiguration.PropertiesWriter;

import java.io.*;
import java.nio.charset.StandardCharsets;

PropertiesConfiguration config = new PropertiesConfiguration();
config.setProperty("a", "Rumänien");

// 用try-with-resources确保Writer自动关闭
try (OutputStream out = new FileOutputStream("your-config.properties");
     OutputStreamWriter osw = new OutputStreamWriter(out, StandardCharsets.UTF_8);
     PropertiesWriter writer = new PropertiesWriter(osw, false)) {
    config.write(writer);
} catch (IOException e) {
    // 处理IO异常
    e.printStackTrace();
}

关键注意事项

  • 必须指定UTF-8编码:不管是保存还是读取,都要确保用UTF-8处理文件,否则特殊字符可能出现乱码。
  • PropertiesWriter的第二个构造参数:false表示禁用Unicode转义,这是解决问题的核心开关。
  • 读取配置时:如果之前的文件是用默认转义方式保存的,不用担心——Configuration2读取时会自动解析Unicode转义符,还原成正确的字符(你已经提到读取正常,这点应该没问题)。

内容的提问来源于stack exchange,提问作者delcanovega

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:00:54