是否可以在杰克逊CsvMapper中使用自定义编码?我需要CSV用Windows1252编码,而不是默认的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
发布于 2020-09-08 10:58:57
Javadoc指定writeValueAsBytes编码方法强制为UTF-8.
要定制字符集,您必须创建一个内存中的写入器作为中间输出。
示例:
val buffer = ByteArrayOutputStream()
OutputStreamWriter(buffer, encoding).use {
mapper.writeValue(it, result)
}
val bytes = buffer.toByteArray();编辑
再看一看,我看到您尝试将字节数组读入字符串。该操作将中断任何自定义编码的工作。Java内部系统对文本表示使用UTF-16编码,而作为toString(encoding)输入提供的编码可以从原始字符集(在默认情况下是窗口)解码字节。
它不会为进一步的写作服务,因为是作者负责编码,而不是内容。因此,一旦编写了字节数组,要么按原样返回它,要么在最后的编码器后面自定义编码。
https://stackoverflow.com/questions/63789835
复制相似问题