Apache 的 FileHandler 保存 unicode 转义而不是特殊字符
Apache's FileHandler saves unicode escapes instead of special chars
我一直在使用 Apache Commons Configuration2 来管理 属性 文件。问题是,当将配置保存到文件时,特殊字符被替换为它们的 Java 的源代码;如 a=Rumänien -> a=Rum\u00E4nien
.
有什么方法可以避免这种情况吗? 最好使用 FileHandlers 或类似的 Writers/Streams,因为我无法使用 Apache 提供的生成器。
读取正确。如果我设置一个断点,我可以看到存储的正确值,但是,一旦我想保留配置,我就会得到那种结果。
这是一个 MCVE,请注意您需要 link 以下 Apache 库:
- Configuration2
- Logging
-
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 的 属性 文件的严格定义要求它们采用 ISO-8859-1
编码,所有不在其中的 Unicode 字符都将被编码使用 \uXXXX
转义。所以技术上说一切都按规定工作。
如果库允许(可能带有 custom writer),您可以破解它以编写 UTF-8 而不是执行转义。
我一直在使用 Apache Commons Configuration2 来管理 属性 文件。问题是,当将配置保存到文件时,特殊字符被替换为它们的 Java 的源代码;如 a=Rumänien -> a=Rum\u00E4nien
.
有什么方法可以避免这种情况吗? 最好使用 FileHandlers 或类似的 Writers/Streams,因为我无法使用 Apache 提供的生成器。
读取正确。如果我设置一个断点,我可以看到存储的正确值,但是,一旦我想保留配置,我就会得到那种结果。
这是一个 MCVE,请注意您需要 link 以下 Apache 库:
- Configuration2
- Logging
-
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 的 属性 文件的严格定义要求它们采用 ISO-8859-1
编码,所有不在其中的 Unicode 字符都将被编码使用 \uXXXX
转义。所以技术上说一切都按规定工作。
如果库允许(可能带有 custom writer),您可以破解它以编写 UTF-8 而不是执行转义。