导出 CSV 时的编码问题

10

我有一个listgrid,在其中所有项都正确显示为带有变音符号的字符,就像它们在本地数据库和jboss服务器上一样。

然而,在jboss服务器上,当我尝试将其导出为csv时,所有变音符号字符都被替换了,所以我得到的结果类似于È ˜coala而不是Școala,尽管变音符号在listgrid中显示正常。

在本地工作正常,无论是在Listgrid中显示还是导出。

这是我用于导出的代码:

private void Export() {
  String exportAs = (String) m_ExportForm.getField("exportType").getValue();  
  FormItem item = m_ExportForm.getField("showInWindow");  
  boolean showInWindow =  item.getValue() == null ? false : (Boolean) item.getValue();  

  // exportAs is either XML or CSV, which we can do with requestProperties
  Map<String,String> params= new java.util.HashMap<String, String>();
  params.put("Accept-Charset","utf-8");

  DSRequest dsRequestProperties = new DSRequest();
  dsRequestProperties.setHttpHeaders(params);
  dsRequestProperties.setExportValueFields(true);
  dsRequestProperties.setExportAs((ExportFormat)EnumUtil.getEnum(ExportFormat.values(), exportAs));  
  dsRequestProperties.setExportDisplay(showInWindow ? ExportDisplay.WINDOW : ExportDisplay.DOWNLOAD);

  // TODO: move in user-config
  dsRequestProperties.setExportTitleSeparatorChar("_");
  dsRequestProperties.setExportDelimiter(";");

  dsRequestProperties.setExportFilename("export." + extensionsValueMap.get(exportAs));
  dsRequestProperties.setContentType("text/csv; charset=UTF-8");
  m_Target.Export(dsRequestProperties);

  Close();
}

而且,在我的jboss 7属性文件中,我有这个:

<system-properties>
  <property name="org.apache.catalina.connector.URI_ENCODING" value="UTF-8"/>
  <property name="org.apache.catalina.connector.USE_BODY_ENCODING_FOR_QUERY_STRING" value="true"/>
</system-properties>

这将使列表格正确显示变音符号。

同时,在我的web.xml中,我为我的servlet设置了

<init-param>
  <param-name>encoding</param-name>
  <param-value>UTF-8</param-value>
</init-param>

也许我走错了路,这可能是由其他原因引起的。

本地导出的文件和从Jboss服务器导出的文件具有完全相同的文件大小。

对于我的Jboss JVM,我设置了java_opts属性。

-Dfile.encoding=UTF-8

编辑: 根据建议添加了params映射表。仍然没有任何结果。


也许这会给你一些启示?https://community.jboss.org/message/646601 - Phani
捕获HTTP请求和响应头并将它们发布。此外,发布您下载的CSV文件大小(以字节为单位),包括正常工作的文件和出现“??”的文件。 - Old Pro
3个回答

3

听起来像是字符编码/解码问题。

你的代码生成了一个UTF-8编码的CSV文件。然而,你用什么程序来读取这个CSV文件呢?是Windows记事本吗?如果是Windows应用程序,很可能会假定文本文件的编码是ISO-8859-1

选项1:

告诉记事本或你的Windows应用程序编码方式。在记事本中,在文件/打开对话框中有一个编码下拉列表。将其切换为UTF-8。

选项2:

将源代码中的编码从UTF-8更改为与Windows默认编码匹配的ISO-8859-1。更改以下行:

dsRequestProperties.setContentType("application/csv; charset=UTF-8");

to

dsRequestProperties.setContentType("application/csv; charset=ISO-8859-1");

希望这个方法能够奏效。设置org.apache.catalina.connector.URI_ENCODING不会影响文件编码,应该保持原样。

问题出在本地,我将jvm编码设置为utf-8,如果我下载文件,我会得到带有变音符号的文件,这是可以接受的。但是如果我在我的jboss服务器上做同样的事情,文件就已经保存为没有变音符号的文件了。这不是读取文件的问题。 - Fofole
@Fofole,JBoss服务器为下载的文件声明了哪个字符集?Content-type: text/plain; charset=UTF-8?您的本地开发机器和JBoss服务器上是否相同?Fiddler / Netmon或WireShark显示了什么? - Ben

1

您的JBoss设置中可能有一些额外的FilterServlets干扰了编码。可能与身份验证或压缩有关。


1

我必须承认,在这个组合中我没有看到过 charset=...。 但是字符集对于文本更有意义,所以首先尝试:

dsRequestProperties.setContentType("text/csv; charset=UTF-8");

原因在于,应用程序可能包含二进制数据,因此使用字符集字节编码可能存在风险。

添加:我的错误解释

可能字符串asExport得到了UTF-8,但对于多字节字符而言,它会给出两个字符。这些字符也在非ASCII范围内,并且您的响应希望提供ISO-8859-1(默认的Latin-1),并写入??这是2个错误。

您可以检查asExport。为什么尽管charset=UTF-8,写入UTF-8仍然失败...


改了它,结果还是一样的 :( - Fofole
你已经进行了全局设置,但是servlet也有一个编码的init-param;http://www.smartclient.com/smartgwtee/server/javadoc/index.html?com/isomorphic/servlet/IDACall.html。虽然我无法想象你没有看到这一点。也许`exportAs`已经出现了问题;我在我的答案中添加了这个。 - Joop Eggen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接