Freemarker CSV 生成 - 带有中文文本的 CSV 会截断 csv 内容

问题描述

我有一个非常奇怪的问题。我正在使用 Java 8、Struts2 和 Freemarker 2.3.23 生成 csv 和 html 文件格式的报告(via.csv.ftl 和 .html.ftl 模板均以 utf-8 编码保存),数据来自 postgres 数据库。 数据里面有汉字,当我生成html格式的报告时,很好,很完整,汉字显示正常。但是当报告在 csv 中生成时,我观察到:

  1. 如果我使用 -Dfile.encoding=UTF-8 VM 选项运行应用程序中文字符会正确生成但报告不完整(即文本在近端部分被特别截断)
  2. 如果我运行应用程序没有 -Dfile.encoding=UTF-8 VM 选项中文字符显示在问号 (?????) 中,但报告是完整的

此外,该应用使用 StringWriter 将数据写入 csv 和 html 模板。

那么,可能是什么问题?我是否达到了 Java 字符限制?我也没有在日志中看到错误。感谢您的帮助。提前致谢。

更新:

StringWriter 返回整个数据,但是当将数据写入 OutputStream 时,这是一些数据丢失的地方。

一个更新:

看起来问题出在 contentLength 上(因为应用程序是一个 web 应用程序,并且 csv 是作为文件下载类型生成的)是使用 String.length() 从数据作为字符串生成的。 String.length() 方法在应该有更多值时返回更少的值。也许这与中文字符有关,这就是为什么报告的长度值较少的原因。

解决方法

我能够通过使用 String.getBytes("UTF-8").length 解决 contentLength 的问题