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

作者:lizongbo 发表于:20:28. 星期一, 七月 7th, 2008
版权声明:可以任意转载,转载时请务必以超链接形式标明文章和作者信息及本版权声明

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

标签:

recent related 1 searches :

这篇文章发布于 2008年07月7日,星期一,20:28,归类于 Java。 您可以跟踪这篇文章的评论通过 RSS 2.0 feed。 您可以跳过直接留下评论。目前不允许Pinging。

4 条评论 发表在“java.net.URLEncoder对空格的处理的问题”上

  1. chowgofee 说:

    如果文件名本身就有加号,那该如何处理?

    Reply

    lizongbo reply on 四月 22nd, 2009:

    加号本身就会自动被编码成%2B了阿。

  2. chowgofee 说:

    我的意思是,如果文件名本身就包括加号,比如原来的文件名是“测试+有加号 空格.doc”,你这样子处理,岂不是变成“测试 有加号 空格.doc”了吗?

    Reply

    lizongbo reply on 四月 26th, 2009:

    我替换的是加号,而不是%2B。是先进行URLEncode,得到的内容里已经没有原始的加号了,只有表示空格的加号,此时再进行的替换操作。文中代码已经写明。

留下回复