如何解决在Jackson CsvMapper中使用自定义字符集
是否可以在Jackson CsvMapper中使用自定义编码?我需要将CSV编码为Windows-1252,而不是默认的UTF-8。
这是我的代码的简化版本:
class CSVService(private val mapper: CsvMapper) {
fun <T : CsvResponse> writeAsCSV(result: List<T>,resultClass: KClass<T>,separatorChar: Char = ',',encoding: Charset = Charsets.WINDOWS_1252): String {
mapper.schemaFor(resultClass.java).withHeader().withColumnSeparator(separatorChar)
return mapper.writeValueAsBytes(result).toString(encoding) // does not work.
}
}
似乎对象映射器writeValueAsBytes
方法具有UTF-8硬编码。
有人可以举例说明如何配置对象映射器以使用其他编码吗?
先谢谢了。 任何帮助表示赞赏。
使用com.fasterxml.jackson.dataformat:jackson-dataformat-csv:2.11.2
解决方法
Jackson Javadoc指定将方法writeValueAsBytes编码强制为UTF-8。
要自定义字符集,您必须创建一个内存编写器作为中间输出。
示例:
val buffer = ByteArrayOutputStream()
OutputStreamWriter(buffer,encoding).use {
mapper.writeValue(it,result)
}
val bytes = buffer.toByteArray();
编辑:
第二眼,我看到您尝试将字节数组读回字符串。该操作将竭尽全力自定义编码。 Java内部系统使用UTF-16编码来表示文本,并且作为toString(encoding)
输入提供的编码用于解码原始字符集(默认情况下是Windows)中的字节。
它将不再用于进一步的编写,因为是编写者负责编码,而不是内容。因此,一旦编写了字节数组,要么按原样返回它,要么稍后必须在最终编码器上自定义编码。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。