【发布时间】:2021-04-30 21:16:38
【问题描述】:
我有一个非常奇怪的问题。我正在使用 Java 8、Struts2 和 Freemarker 2.3.23 生成 csv 和 html 文件格式的报告(via.csv.ftl 和 .html.ftl 模板都以 utf-8 编码保存),数据来自 postgres 数据库。 数据中有汉字,当我生成html格式的报告时,它很好,完整,汉字显示正确。但是当在 csv 中生成报告时,我观察到:
- 如果我使用 -Dfile.encoding=UTF-8 VM 选项运行应用程序,中文字符会正确生成但报告不完整(即文本在近端部分被截断)
- 如果我运行应用程序没有 -Dfile.encoding=UTF-8 VM 选项,中文字符显示在问号 (?????) 但报告完整
此外,该应用使用 StringWriter 将数据写入 csv 和 html 模板。
那么,可能是什么问题?我是否达到了 Java 字符数限制?我也没有在日志中看到错误。感谢你的帮助。提前致谢。
更新:
StringWriter 会完整返回数据,但是当将数据写入 OutputStream 时,部分数据会丢失。
另一个更新:
看起来问题出在contentLength(因为该应用程序是一个 web 应用程序,并且 csv 是作为文件下载类型生成的)是使用 String.length() 从数据作为字符串生成的。 String.length() 方法在应该有更多值时返回更少的值。也许它与汉字有关,这就是为什么长度被报告的价值较小的原因。
【问题讨论】:
标签: csv java-8 freemarker cjk truncated