关于java:UTF-8 JAXB Marshalling后XML内容仍然是ISO 8859-1

XML content still ISO 8859-1 after UTF-8 JAXB Marshalling

我正在使用骆驼创建一个 JAXB 对象,对其进行编组,然后将结果写入 UTF-8 编码的 XML 文件。
我的一些 xml 内容是从使用 ISO 8859-1 编码的数据源中获取的:

hier 是我的骆驼路线:

1
2
3
4
5
6
7
8
9
10
11
import org.apache.camel.converter.jaxb.JaxbDataFormat;

JaxbDataFormat jaxbDataFormat = new JaxbDataFormat(Claz.class.getPackage().getName());

from("endpoint")

   .process(//createObjectBySettingTheDataFromSource)

   .marshal(jaxbDataFormat)

   .to(FILEENDPOINT?charset=utf-8&fileName=" +Filename);

XML 生成成功,但是从源获取的数据内容仍然是 ISO 编码,没有用 UTF8 解析。

1
2
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>    
     <Name>M??????e Faà¥nder</Name> //M??rthe Fa??ender

将文件编码更改为 ISO 8859-1 即可成功解析内容。

我尝试在将数据设置到 JAXB 对象之前对其进行转换,但仍未在 UTF-8 中解析。

1
2
  byte[] nameBytes = name.getBytes(StandardCharsets.ISO_8859_1);
  return new String(nameBytes, StandardCharsets.UTF_8);

问题只是在 Linux 下出现,有没有人知道如何操作 ISO_8859_1 数据并在 xml 中毫无问题地设置它?


嗯,UTF-8 是默认字符集(至少对于文件端点而言),AFAIK Camel 不会尝试分析输入消息的给定字符集。

所以我猜如果你不声明一个不同于 UTF-8 的输入字符集,然后将文件写为 UTF-8,那么从 Camels 的angular来看,就不需要转换任何东西。

1
2
.from("file:inbox") // implicit UTF-8
.to("file:outbox?charset=utf-8") // same charset, no conversion needed

至少对于文件,您可以声明源编码,以便 Camel 知道它必须转换有效负载。

1
2
.from("file:inbox?charset=iso-8859-1")
.to("file:outbox?charset=utf-8") // conversion needed

如果您无法声明输入字符集(我认为这取决于端点类型),则必须显式转换有效负载。

1
2
3
4
.from("file:inbox")
.convertBodyTo(byte[].class,"utf-8")
// message body is now a byte array and written to file as is
.to("file:outbox")

有关详细信息,请参阅 Camel 文件文档中的"使用字符集"部分。