为什么要这么转?关于文件下载的文件名的(utf8、gbk、8859-1)。

Leemaasn 2006-05-30 05:11:34
有个字符转码的问题,想不明白,问问大家,
是关于从服务器下载文件内容和文件名的。

首先,已经通过
SetCharacterEncodingFilter
设置字符编码为utf8。

接着,
String fileName = request.getParameter("fileName");
这时,fileName取到的值为“测试文件名”,编码格式为utf8;
然后,进行转码(问题:为什么要从gbk转成8859_1,而不是从utf8转成8859_1?)
String strFileName = new String(fileName.getBytes("gbk"), "8859_1");

再设置文件下载的默认文件名
response.addHeader("Content-Disposition", "attachment;filename=" + strFileName);
(这时,在浏览器上提示保存文件的对话框上,显示的文件名是正常的,如果从utf8转的话,就显示不正常了,为什么?)

然后,再输出内容
response.getOutputStream().write(fileName.getBytes());
最终输出的文件的内容是以utf8格式保存的,并且显示正常。

我的操作系统是Win2k pro 简体
jdk 1.4
tomcat 5.0
...全文
601 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
kingofworl 2006-05-31
  • 打赏
  • 举报
回复
关注
amozon 2006-05-31
  • 打赏
  • 举报
回复


/**
* 编码是否有效
* @param text
* @return
*/
private boolean Utf8codeCheck(String text){
String sign = "";
if (text.startsWith("%e"))
for (int i = 0, p = 0; p != -1; i++) {
p = text.indexOf("%", p);
if (p != -1)
p++;
sign += p;
}
return sign.equals("147-1");
}

/**
* 是否Utf8Url编码
* @param text
* @return
*/
public boolean isUtf8Url(String text) {
text = text.toLowerCase();
int p = text.indexOf("%");
if (p != -1 && text.length() - p > 9) {
text = text.substring(p, p + 9);
}
return Utf8codeCheck(text);
}

Leemaasn 2006-05-31
  • 打赏
  • 举报
回复
从这里

首先,已经通过
SetCharacterEncodingFilter
设置字符编码为utf8。

和这里

response.getOutputStream().write(fileName.getBytes());
最终输出的文件的内容是以utf8格式保存的,并且显示正常。

都可以知道是utf8的啊
南南北北 2006-05-31
  • 打赏
  • 举报
回复
分析一下流程:
1.SetCharacterEncodingFilter设置字符编码为utf8。就是告诉服务器在处理InputStream和
OutputStream时处理消息体时以UTF-8编码格式进行存储.也就是说以post提交的信息,
SetCharacterEncoding有效,而对以get方式提交是无效的.
2.String fileName = request.getParameter("fileName");这句,把"测试文件名"这个字符串以
utf-8格式存储为字符串fileName.
3.String strFileName = new String(fileName.getBytes("gbk"), "iso8859-1");分两步,
byte[] b = fileName.getBytes("gbk");把字符串fileName以gbk字符编码解析为byte数组b.
String strFileName = new String(b,"iso8859-1");把字节数组b以iso8859-1字符编码解析,并
生成字符串strFileName(unicode字符编码,java内部以unincode处理字符串).
4.response.addHeader("Content-Disposition", "attachment;filename=" + strFileName);
addHeader方法第二个参数会被服务器以iso8859-1字符编码进行解析,也就是解析strFileName
(unicode字符编码的)为字节数组并存入OutputStream中,发送给客户端,客户端收到后以系统默
认的字符编码格式解析头信息(处理OutputStream中的头信息和消息体是不一样的).
综上可见整个过程:UTF-8-->GBK-->ISO8859-1-->unicode-->ISO8859-1(服务器默认)-->GBK(客
户端默认)并显示,从这个转换过程可以回答lz的两个为什么了!
5.response.getOutputStream().write(fileName.getBytes());
最终输出的文件的内容是以utf8格式保存的,并且显示正常。
此过程在response.getOutputStream()中操作,使用的都是UTF-8编码!所以没有问题!

个人的一点分析,希望对大家能有所帮助,错误或不足的地方,请楼下的兄弟指正!
terry_yip 2006-05-31
  • 打赏
  • 举报
回复
8859_1是最简单的编码规则,每一个字节直接作为一个 UNICODE 字符。比如,[0xD6, 0xD0] 这两个字节,通过 iso-8859-1 转化为字符串时,将直接得到 [0x00D6, 0x00D0] 两个 UNICODE 字符,即 "?D"。

反之,如果将 UNICODE 字符串通过 iso-8859-1 转化为字节串时,只能正常转化 0~255 范围的字符。

河蟹涉贿 2006-05-30
  • 打赏
  • 举报
回复
请教一下怎么个测法?
贝壳鱼 2006-05-30
  • 打赏
  • 举报
回复
Leemaasn 2006-05-30
  • 打赏
  • 举报
回复
测试出来的啊
河蟹涉贿 2006-05-30
  • 打赏
  • 举报
回复
你怎么能知道 “这时,fileName取到的值为“测试文件名”,编码格式为utf8;”??
harston 2006-05-30
  • 打赏
  • 举报
回复
可恶的编码!

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧