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 文件文档中的"使用字符集"部分。