如何解决Freemarker CSV 生成 - 带有中文文本的 CSV 会截断 csv 内容
我有一个非常奇怪的问题。我正在使用 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() 方法在应该有更多值时返回更少的值。也许这与中文字符有关,这就是为什么报告的长度值较少的原因。
解决方法
我能够通过使用 String.getBytes("UTF-8").length 解决 contentLength
的问题
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。