我正在使用camel 2.14.1并在tokenize标记内使用group = 10000分割带有中文/日文字符的巨大xml文件。 根据分组成功创建文件,但中文/日文文本代码将转换为垃圾字符。
我尝试在使用“ConvertBodyTo”创建新XML之前强制执行UTF-8,但仍然存在问题。
有人能帮助我!!
答案 0 :(得分:0)
我尝试使用带分组的tokenize拆分csv文件时遇到了类似的问题。
示例csv文件:(带分隔符 - '|') 的 CandidateNumber | CandidateLastName | CandidateFirstName | EducationLevel 强>
CAND123C001 | Wells | Jimmy |学士学位(±16岁)
CAND123C002 | Wells | Tom |学士学位(±16岁)
CAND123C003 | Wells | James |学士学位(±16岁)
CAND123C004 | Wells | Tim |学士学位(±16岁)
使用分组进行令牌化后,±字符已损坏。我最初的假设是问题是没有为拆分设置正确的文件编码,但交换似乎具有属性CamelCharsetName = ISO-8859-1的正确值。
from("file://<dir with csv files>?noop=true&charset=ISO-8859-1")
.split(body().tokenize("\n",2,true)).streaming()
.log("body: ${body}");
同样适用于不使用分组。
from("file://<dir with csv files>?noop=true&charset=ISO-8859-1")
.split(body().tokenize("\n")).streaming()
.log("body: ${body}");
感谢这篇文章,它确认了问题是在分组时。
在驼峰代码库中查看GroupTokenIterator问题似乎是使用TypeConverter将String转换为InputStream的方式
// convert to input stream
InputStream is =
camelContext.getTypeConverter().mandatoryConvertTo(InputStream.class, data);
...
注意: mandatoryConvertTo()有一个带有交换的重载方法
<T> T mandatoryConvertTo(Class<T> type, Exchange exchange, Object value)
由于交换未作为参数传递,因此它总是回退到使用系统属性“org.apache.camel.default.charset”设置的默认字符集
潜在修复:
// convert to input stream
InputStream is =
camelContext.getTypeConverter().mandatoryConvertTo(InputStream.class, exchange, data);
...
由于此修复程序位于camel-core中,另一个可能的选项是使用split而不进行分组,并将 AgrregateStrategy 与 completionSize()和 completionTimeout()一起使用
虽然将它固定在camel-core中会很棒。