我正在尝试使用 Apache Camel Splitter 和 xtokenize 解析 UTF-16 编码文档,这委托(delegate)给 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 解析器 (Woodstox) 应该能够自动检测文件编码,只要 Camel 允许它完成这项工作。
有没有办法不自己实现编码检测?
最佳答案
好的,我可以看到当前的源代码将回退并使用平台编码。因此,不支持使用 XML 节中提供的编码的用例。
我不确定 Camel 是否真的需要回退到默认平台编码,因为它在拆分器中使用 java.util.Scanner
,并且它支持在不使用特定编码的情况下进行扫描。
也许您可以尝试修补 XMLTokenExpressionIterator
中的源代码并在本地测试它,然后在此处报告。
然后我们可以看看是否可以在 Apache Camel 中选择是否使用回退编码。
在当前版本的 Apache Camel 中,您始终可以扩展 XMLTokenExpressionIterator
并重写 doEvaluate
方法,然后调用不带字符集参数的 createIterator
方法。然后将您的自定义迭代器与 Camel splitter 一起使用。
关于java - Apache Camel 处理 XML 文件中声明的编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46322376/