[align=left]做了个word保存String id = request.getParameter("id");
Detail dd = dbo.find_by_id(new Integer(id));
PrintWriter out = response.getWriter();
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
String title = dd.getTitle().trim();
String detailContent = dd.getDetailContent();
response.setHeader("Content-disposition", "attachment; filename="+URLEncoder.encode(title,"UTF-8")+".doc");
out.write("<html>");
out.write("<head>");
out.write("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">");
out.write("</head>");
out.write("<body>");
out.write("<h3 align=\"center\">"+title+"</h3><br>");
out.write(detailContent);
out.write("</body>");
out.write("</html>");
[/align]
发现当标题有一定长度时,会截断一部分字符串
比如:问题说明越详细,回答也会越准确!参见如何提问。
会被截成
细,回答也会越准确!参见如何提问。
请问这个怎么解决??
Detail dd = dbo.find_by_id(new Integer(id));
PrintWriter out = response.getWriter();
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
String title = dd.getTitle().trim();
String detailContent = dd.getDetailContent();
response.setHeader("Content-disposition", "attachment; filename="+URLEncoder.encode(title,"UTF-8")+".doc");
out.write("<html>");
out.write("<head>");
out.write("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">");
out.write("</head>");
out.write("<body>");
out.write("<h3 align=\"center\">"+title+"</h3><br>");
out.write(detailContent);
out.write("</body>");
out.write("</html>");
[/align]
发现当标题有一定长度时,会截断一部分字符串
比如:问题说明越详细,回答也会越准确!参见如何提问。
会被截成
细,回答也会越准确!参见如何提问。
请问这个怎么解决??
楼主【feng8008】截止到2008-07-31 11:17:13的历史汇总数据(不包括此帖):
发帖的总数量:16 发帖的总分数:100 每贴平均分数:6
回帖的总数量:47 得分贴总数量:16 回帖的得分率:34%
结贴的总数量:15 结贴的总分数:80
无满意结贴数:10 无满意结贴分:230
未结的帖子数:1 未结的总分数:20
结贴的百分比:93.75 % 结分的百分比:80.00 %
无满意结贴率:66.67 % 无满意结分率:287.50%
值得尊敬
取消马甲机器人,请点这里:http://www.java2000.net/mycsdn/robotStop.jsp?usern=feng8008
×××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××
4. 测试并分析文件名乱码问题
response.setHeader()下载中文文件名乱码问题
response.setHeader("Content-Disposition", "attachment; filename=" + java.net.URLEncoder.encode(fileName, "UTF-8"));
下载的程序里有了上面一句,一般在IE6的下载提示框上将正确显示文件的名字,无论是简体中文,还是日文。不过当时确实没有仔细测试文件名为很长的中文文件名的情况。 现如今经过仔细测试,发现文字只要超过17个字,就不能下载了。分析如下:
(1). 通过原来的方式,也就是先用URLEncoder编码,当中文文字超过17个时,IE6 无法下载文件。这是IE的bug,参见微软的知识库文章 KB816868 。原因可能是IE在处理 Response Header 的时候,对header的长度限制在150字节左右。而一个汉字编码成UTF-8是9个字节,那么17个字便是153个字节,所以会报错。而且不跟后缀也不对.
(2). 解决方案:将文件名编码成ISO8859-1是有效的解决方案,代码如下:
response.setHeader( "Content-Disposition", "attachment;filename=" + new String( fileName.getBytes("gb2312"), "ISO8859-1" ) );
在确保附件文件名都是简 体中文字的情况下,那么这个办法确实是最有效的,不用让客户逐个的升级IE。如果台湾同胞用,把gb2312改成big5就行。但现在的系统通常都加入了 国际化的支持,普遍使用UTF-8。如果文件名中又有简体中文字,又有繁体中文,还有日文。那么乱码便产生了。另外,在上Firefox (v1.0-en)下载也是乱码。 (3). 参看邮件中的中文附件名的形式,用outlook新建一个带有中文附件的邮件,然后看这个邮件的源代码,找到:
Content-Disposition: attachment;
filename="=?gb2312?B?0MK9qCDOxLG+zsS1tS50eHQ=?="
用这个filename原理上就可以显示中文名附件,但是现在IE并不支持,Firefox是支持的。尝试使用 javamail 的MimeUtility.encode()方法来编码文件名,也就是编码成 =?gb2312?B?xxxxxxxx?= 这样的形式,并从 RFC1522 中找到对应的标准支持。
折中考虑,结合了一、二的方式,代码片断如下:
String fileName = URLEncoder.encode(atta.getFileName(), "UTF-8");
/*
* see http://support.microsoft.com/default.aspx?kbid=816868
*/
if (fileName.length() > 150) {
String guessCharset = xxxx
//根据request的locale 得出可能的编码,中文操作系统通常是gb2312
fileName = new String(atta.getFileName().getBytes(guessCharset), "ISO8859-1");
}
response.setHeader("Content-Disposition", "attachment; filename=" + fileName);编码转换的原理:
首先在源程序中将编码设置成GB2312字符编码,然后将源程序按Unicode编码转换成字节码加载到内存中(java加载到内存中的字节码都是Unicode编码),然后按GB2312编码获得中文字符串的字节数组,然后生成按ISO8859-1编码形式的Unicode字符串(这时的4个字节就变成了8个字节,高位字节补零),当在网络中传输时,因为setHeader方法中的字符只能按ISO8859-1传输,所以这时候就又把Unicode字符转换成了ISO8859-1的编码传到浏览器(就是把刚才高位补的零全去掉),这时浏览器接收到的ISO8859-1码的字符因为符合GB2312编码,所以就可以显示中文了。××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××