我试图使用带有xtokenize的Apache解析一个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中指定的那样,如果只有Camel让Camel来完成工作,那么Woodstox应该能够自动检测文件编码。
有没有办法不自己实现编码检测?
发布于 2017-09-29 18:13:47
根据我的评论创建了一个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-21 07:45:56
好的,我可以看到当前的源代码将退步,并使用平台编码。因此,不支持XML节中提供的编码用例。
我不确定Camel是否真的需要退回到默认平台编码,因为它在拆分器中使用java.util.Scanner,并且它支持不使用特定编码的扫描。
也许您可以尝试在XMLTokenExpressionIterator中修补源代码,并在本地测试它,然后在这里报告。
然后,我们可能会看到,在Apache中,是否可以选择使用回退编码。
在Apache的当前版本中,您始终可以扩展XMLTokenExpressionIterator并重写doEvaluate方法,然后在没有字符集参数的情况下调用createIterator方法。然后使用您的自定义迭代器与骆驼分离器。
https://stackoverflow.com/questions/46322376
复制相似问题