【问题标题】:Freemarker CSV generation - CSV with Chinese text truncates the csv contentsFreemarker CSV 生成 - 带有中文文本的 CSV 会截断 csv 内容
【发布时间】: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 中生成报告时,我观察到:

  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() 方法在应该有更多值时返回更少的值。也许它与汉字有关,这就是为什么长度被报告的价值较小的原因。

【问题讨论】:

    标签: csv java-8 freemarker cjk truncated


    【解决方案1】:

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

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-26
    • 1970-01-01
    • 2011-05-03
    • 2015-05-29
    • 1970-01-01
    • 1970-01-01
    • 2013-05-29
    相关资源
    最近更新 更多