10

我有一个列表网格,其中所有项目都用变音符号正确显示,因为它们在本地和 jboss 服务器上的 db 中。

但是,在 jboss 服务器上,当我尝试导出为 csv 时,所有变音符号都被替换了,所以我得到了 Ã^Â~coala 而不是 Școala 之类的东西,尽管变音符号在列表网格中正确显示。

在 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

编辑:由于建议添加了参数映射。依然没有。

4

3 回答 3

3

听起来这是一个字符编码/解码问题。

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

选项1:

告诉记事本或您的 Windows 应用程序编码。使用记事本,文件/打开对话框中有一个编码下拉菜单。将此切换为 UTF-8。

选项 2:

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

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

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

希望能解决问题。该org.apache.catalina.connector.URI_ENCODING设置不影响文件编码,应保持原样。

于 2012-04-23T09:38:58.150 回答
1

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

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

可以很好地指示二进制数据的原因application会使字符集字节编码变得危险。


补充:我对错误的解释

也许字符串asExport得到了 UTF-8,但给出了一个多字节字符而不是两个字符。这些也在非 ASCII 范围内,并且您的响应以某种方式希望提供 ISO-8859-1(默认 latin-1),并写入??. 那是2个错误。

你可以检查asExport. 为什么尽管 charset=UTF-8 以 UTF-8 写入不成功...

于 2012-04-23T09:56:25.550 回答
1

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

于 2012-05-04T13:10:09.113 回答