Camel:使用Group后UTF-8编码丢失

时间:2016-03-18 02:24:37

标签: encoding utf-8 apache-camel tokenize

我正在使用camel 2.14.1并在tokenize标记内使用group = 10000分割带有中文/日文字符的巨大xml文件。 根据分组成功创建文件,但中文/日文文本代码将转换为垃圾字符。

我尝试在使用“ConvertBodyTo”创建新XML之前强制执行UTF-8,但仍然存在问题。

有人能帮助我!!

1 个答案:

答案 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中会很棒。