Java 导出到CSV编码问题

Java 导出到CSV编码问题,java,gwt,encoding,jboss,export,Java,Gwt,Encoding,Jboss,Export,我有一个listgrid,其中所有项目都正确地显示为带符号,因为它们在本地和jboss服务器上都在db中 然而,在jboss服务器上,当我尝试导出为csv时,所有的变音符号都被替换,因此我得到了类似于Ȉcoala而不是Școala的东西,尽管变音符号在listgrid中正确显示 本地工作良好,可以在listgrid中显示和导出 这是我的出口代码: private void Export() { String exportAs = (String) m_ExportForm.getFiel

我有一个listgrid,其中所有项目都正确地显示为带符号,因为它们在本地和jboss服务器上都在db中

然而,在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();
}

编辑:根据建议添加了参数映射。还是没什么。

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

您的代码以UTF-8编码生成了一个CSV文件。但是,您使用什么程序读取CSV?Windows记事本?如果它是一个Windows应用程序,很可能是假定文本文件是编码的

备选案文1:

告诉记事本或Windows应用程序编码。对于记事本,文件/打开对话框中有一个编码下拉列表。切换到UTF-8

备选案文2:

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

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


希望他能成功。
org.apache.catalina.connector.URI\u编码设置不影响文件编码,应该保持原样。

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

dsRequestProperties.setContentType("text/csv; charset=UTF-8");
原因是,
application
很可能表示二进制数据,这会使字符集字节编码变得危险


添加:我对错误的解释

可能字符串
asExport
得到了UTF-8,但给出了一个多字节字符,而不是两个字符。它们也在非ASCII范围内,您的响应不知何故希望传递ISO-8859-1(默认拉丁语-1),并写入
。这是两个错误


您可以检查
asExport
。为什么尽管charset=UTF-8,但在UTF-8中写入却没有成功…

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

这可能会让您有所了解吗?捕获HTTP请求和响应头并发布它们。此外,以字节为单位发布您下载的CSV文件大小,该文件和带有“?”的文件。问题是在本地,我将jvm编码为utf-8。如果我下载该文件,我会得到带有变音符号的文件,这是正常的。如果我在我的jboss服务器上做了同样的事情,那么该文件将被保存,而不带符号。这不是读取文件的问题。@Fofole,JBoss服务器为下载的文件声明了什么字符集<代码>内容类型:文本/普通;字符集=UTF-8
?在本地开发机器和JBoss服务器上是否相同?fiddler/netmon或WireShark显示了什么?对其进行了更改,结果是一样的:(您进行了全局设置,但servlet也有一个用于编码的init参数;。无法想象您不会看到这一点。也许
exportAs
已经错了;添加到我的答案中
-Dfile.encoding=UTF-8
dsRequestProperties.setContentType("application/csv; charset=UTF-8");
dsRequestProperties.setContentType("application/csv; charset=ISO-8859-1");
dsRequestProperties.setContentType("text/csv; charset=UTF-8");