2008年07月7日 存档

java.net.URLEncoder对空格的处理的问题

2008年07月7日,星期一

java.net.URLEncoder对url进行编码处理的时候,对空格是替换成了加号,而不是%20

java.net.URLEncoder.java的源代码为:

[code]

if (dontNeedEncoding.get(c)) {
if (c == ' ') {
c = '+';
needToChange = true;
}
//System.out.println("Storing: " + c);
out.append((char)c);
i++;
}

[/code]

测试代码

[code]

String url="http://618119.com/docs/测试 空格.doc";
String nurl=url.substring(0,url.lastIndexOf('/')+1)+java.net.URLEncoder.encode(url.substring(url.lastIndexOf('/')+1), "UTF-8");
System.out.println(nurl);
System.out.println(java.net.URLDecoder.decode(nurl, "UTF-8"));

[/code]

执行的结果为:

http://618119.com/docs/%E6%B5%8B%E8%AF%95+%E7%A9%BA%E6%A0%BC.doc
http://618119.com/docs/测试 空格.doc

而在与同事调试的时候,发现对方的web服务器处理得有点问题,没能将加号还原为空格,

对文件名只截取到了空格前面部分的内容,导致在下载的时候,

头信息 content-disposition和Content-Type

写入的内容不对,导致手机无法正常下载文件。

无法正常下载到手机时的头信息是:

content-disposition: attachment; filename=”测试”
Content-Type: application/octet-stream因此修改代码,对url进行替换,将加号替换成”%20″;

修改后的代码为:

[code]

String url="http://618119.com/docs/测试 空格.doc";
String nurl=url.substring(0,url.lastIndexOf('/')+1)+java.net.URLEncoder.encode(url.substring(url.lastIndexOf('/')+1), "UTF-8");
nurl=nurl.replaceAll("\\+", "%20");//处理空格
System.out.println(nurl);
System.out.println(java.net.URLDecoder.decode(nurl, "UTF-8"));

[/code]

执行结果为:

http://618119.com/docs/%E6%B5%8B%E8%AF%95%20%E7%A9%BA%E6%A0%BC.doc
http://618119.com/docs/测试 空格.doc

用手机可以正常下载文件时的头信息为:
content-disposition: attachment; filename=”测试 空格.mp3″
Content-Type: audio/x-mpeg

Tags: Java

Related posts