繁体   English   中英

问题编码java-> xls

[英]Issue encoding java->xls

这不是一个纯Java问题,也可以与HTML相关

我编写了一个Java Servlet,它查询数据库表并将结果显示为html表。 用户还可以要求以Excel表格的形式接收结果。 我通过打印相同的html表来创建Excel工作表,但是内容类型为“ application / vnd.ms-excel”。 Excel文件创建良好。 问题在于表可能包含非英语数据,因此我想使用UTF-8编码。

PrintWriter out = response.getWriter();
response.setContentType("application/vnd.ms-excel:ISO-8859-1");
//response.setContentType("application/vnd.ms-excel:UTF-8");
response.setHeader("cache-control", "no-cache");
response.setHeader("Content-Disposition", "attachment; filename=file.xls");
out.print(src);
out.flush();

非英语字符显示为垃圾(áéíóú)

我也尝试从String转换为字节

byte[] arrByte = src.getBytes("ISO-8859-1");
String result = new String(arrByte, "UTF-8");

但是我仍然会垃圾,我该怎么办? 谢谢

更新:如果我在记事本中打开excel文件,++的文件编码类型为“ UTF-8 without BOM”,如果我将编码更改为“ UTF-8”,然后在Excel中打开文件,则字符“áéíóú”看起来不错。

Excel是二进制格式,而不是文本格式,因此您无需设置任何编码,因为它根本不适用。 无论您使用哪种系统来构建excel文件(例如Apache Poi),都将处理excel文件中的文本编码。

您不应尝试将接收到的字节转换为字符串,而应将它们存储在字节数组中或将其写出到文件中。

编辑:从评论看,听起来好像不是在使用“真实的”二进制excel文件,而是制表符分隔的文本文件(CSV)。 在这种情况下,请确保使用一致的编码,例如始终使用UTF-8。

另外,在调用response.getWriter()之前,请先调用setContentType

参见HttpServletResponse.getPrintWriter()

编辑:您可以尝试编写BOM。 通常不是必需的,但是Office中的文件格式处理与正常情况相去甚远...

Java确实不支持BOM。 您必须伪造它。 这意味着您需要使用响应outputStream而不是writer,因为您需要写入原始字节(BOM)。 因此,您将代码更改为此:

response.setContentType("application/vnd.ms-excel:UTF-8");
// set other headers also, "cache-control" etc..
OutputStream outputStream = response.getOutputStream();
outputStream.write(0xEF);   // 1st byte of BOM
outputStream.write(0xBB);
outputStream.write(0xBF);   // last byte of BOM
// now get a PrintWriter to stream the chars.
PrintWriter out = new PrintWriter(new OutputStreamWriter(outputStream,"UTF-8"));
out.print(src);

将结果打印到标准输出时会收到“垃圾”吗?

编辑(下面注释中的代码标签中的代码): response.setContentType("application/vnd.ms-excel; charset=UTF-8")

尝试使用ServletResponse.setCharacterEncoding(java.lang.String charset)方法。

response.setCharacterEncoding("UTF-8");

我有同样的问题..我通过使用print()而不是write()修复了它

outputStream.print('\ufeff');

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM