请教一下 Servlet 中如何设定下载文件保存用的字符集

在前面一篇日志:理解和灵活应用 Struts2 的文件下载功能 还留下一个问题,在 Servlet 中支持文件下载功能时,客户保存下载文件所用的字符集总是 ANSI(ISO8859-1),如何能设定客户保存文件用的字符集呢?像 BlogJava 的备份数据功能下载后就是用的 UTF-8 字符集的。自己作了一些尝试,总是无济于事,看如下代码是 Servlet 的 doGet() 方法:

访问这个 Servlet 时会提示下载文件 down.txt,保存之后用记事本打开,另存它时看到的是 ANSI 编码,或用 EditPlus 打开右下角显示的是 ANSI。然而要是把上面的 "attachment" 改为 "inline",内容为在线打开,同时右键里看到的却是地地道道的 UTF-8,保存文件却不行。不知道这里各位达人们有无这方面的经验、或是高见,能让下载文件以 UTF-8 编码保存,还望不吝赐教。

 

本文链接 https://yanbin.blog/servlet-download-encoding/, 来自 隔叶黄莺 Yanbin Blog

[版权声明] Creative Commons License 本文采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可。

Subscribe
Notify of
guest

6 Comments
Inline Feedbacks
View all comments
张晓枫
15 years ago

更改服务器编码试了吗?

Feng
15 years ago

在doGet方法的第一句调用 response.setCharacterEncoding("utf-8") 试试。

隔叶黄莺
15 years ago

试过,也是这样子的。

bsli123@hotmail.com
bsli123@hotmail.com
15 years ago

<%

OutputStream os=response.getOutputStream();

RequestContext reqContext = (RequestContext)request.getAttribute("reqContext");

Document inDom = null;

inDom = reqContext.getDocument();

response.reset();

response.setContentType("application/vnd.ms-excel");

String fileName = XmlUtil.getNodeValue(inDom.getElementsByTagName("fileName").item(0));

response.setHeader("content-disposition","attachment; filename="+URLEncoder.encode(fileName,"UTF-8"));

String templateName = XmlUtil.getNodeValue(inDom.getElementsByTagName("templateName").item(0));

String path = request.getRealPath("/") + "/WEB-INF/classes/templates/"+templateName;

XLSTransformerExt transformer = new XLSTransformerExt();

Map map = DynaBeanUtil.createDynaMap(inDom.getFirstChild().getFirstChild());

transformer.transformXLS(path, map, os);

os.flush();

out = pageContext.pushBody();

response.flushBuffer();

out.clear();

if(os!=null) {

os.close();

os = null;

}

%>

隔叶黄莺
15 years ago

谢谢楼上的回复,我一定会试一下的。

李敏
李敏
15 years ago

以前老哥帮过我,现在至少尽点苦力!

经过无数次测试,发现一个很怪的地方!

首先,老哥的代码没有任何问题(整个流程),惟一发现的一个地方是:

out.write("Servlet download file test");

我发现字符串内容为中文或者在"Servlet download file test"的末尾通过输入法工具 (我用的是搜狗)加上一个!标记(除开标准字母)后,再下载的话,格式就是UTF-8的了。我在这方面很弱,所以只能说测试出来的,也不知道什么道理!