2

我正在尝试使用带有 xtokenize 的 Apache Camel Splitter 解析 UTF-16 编码的文档,这代表 Woodstox (com.ctc.wstx.sr.BasicStreamReader),目前我在读取文件之前无法知道文件的编码有些文件是 UTF-16,有些是 UTF-8:

.split().xtokenize(getToken(), 'w', NAMESPACES)

我遇到的问题是 Camel 告诉 Woodstox 使用哪种编码:

String charset = IOHelper.getCharsetName(exchange);

它将默认 UTF-8 设置为编码,因此 BasicStreamReader 尝试将 BOM 字节读取为 UTF-8 并失败

com.ctc.wstx.exc.WstxUnexpectedCharException: Unexpected character '�' (code 65533 / 0xfffd) in prolog; expected '<'

https://www.w3.org/TR/xml/#sec-guessing XML Parser (Woodstox) 中所述,如果只有 Camel 允许它完成工作,它应该能够自动检测文件编码。

有没有办法不自己实现编码检测?

4

2 回答 2

0

好的,我可以看到当前的源代码将回退并使用平台编码。因此,不支持使用 XML 节中提供的编码的用例。

我不确定 Camel 是否真的需要回退到默认平台编码,因为它java.util.Scanner在拆分器中使用 ,并且它支持在不使用特定编码的情况下进行扫描。

也许您可以尝试修补源代码XMLTokenExpressionIterator并在本地为您测试,然后在这里报告。

然后,我们可能会看看是否在 Apache Camel 中选择是否使用回退编码。

在您当前版本的 Apache Camel 中,您始终可以扩展XMLTokenExpressionIterator和覆盖该doEvaluate方法,然后在createIterator没有 charset 参数的情况下调用该方法。然后将您的自定义迭代器与 Camel 拆分器一起使用。

于 2017-09-21T07:45:56.653 回答
0

创建了 Camel JIRA 票证: https ://issues.apache.org/jira/browse/CAMEL-11846 从我的评论中您可以看到,在不知道它是 UTF-16 的情况下,没有简单的解决方案可以将 UTF-16 XML 与 Camel 分开.

尽管子类化 XMLTokenExpressionIterator(一个 ExpressionAdapter 并切换到 InputStream)首先可以工作,但还有其他几个地方使用 xslt & xpath & 转换为 StaxSource 会因同样的原因而中断。

作为一种解决方法,我认为让 XmlStreamReader 提前找出编码(在初始化时发生)并设置 Exchange.CHARSET_NAME 标头或属性更容易。

于 2017-09-29T18:13:47.220 回答