相关文章推荐
老实的领结  ·  qt 用css控制 ...·  1 年前    · 
不爱学习的小虾米  ·  4年前PHP ...·  1 年前    · 

前些时间做了个文件下载的应用,由于中文名文件的原因,所以在拼URL的时候,会提前把文件名转义

fileName = URLEncoder.encode(fileName,"UTF-8");

问题来了,如果文件名中带空格的话,出问题了,空格被转成了+,而不是%20,再向下载服务器进行下载请求时,Servlet不认,直接出错。

于是再考虑了一下,把代码中的空格转成%20。

代码如下:

fileName = URLEncoder.encode(fileName,"UTF-8");
fileName = fileName.replaceAll("\\+","%20");

如上,问题解决了,再decode也可以正常得到正确的文件名。

为什么会这样呢,网上搜了一把,原理如下:

一个URL的基本组成部分包括协议(scheme),域名,端口号,路径和查询字符串(路径参数和锚点标记就暂不考虑了)。路径和查询字符串之间用问号?分离。例如www.example.com/index?param=1,路径为index,查询字符串(Query String)为param=1。URL中关于空格的编码正是与空格所在位置相关:空格被编码成加号+的情况只会在查询字符串部分出现,而被编码成%20则可以出现在路径和查询字符串中。


造成这种混乱局面的原因在于:W3C标准规定,当Content-Type为application/x-www-form-urlencoded时,URL中查询参数名和参数值中空格要用加号+替代,所以几乎所有使用该规范的浏览器在表单提交后,URL查询参数中空格都会被编成加号+。而在另一份规范(RFC 2396,定义URI)里, URI里的保留字符都需转义成%HH格式(Section 3.4 Query Component),因此空格会被编码成%20,加号+本身也作为保留字而被编成%2B,对于某些遵循RFC 2396标准的应用来说,它可能不接受查询字符串中出现加号+,认为它是非法字符。所以一个安全的举措是URL中统一使用%20来编码空格字符。

具体的做法上面也给出了。

道友问我的一个 问题 ,之前确实没遇见过,在此记录一下。 问题 描述 在某网站主页提取 url 进行迭代,爬虫请求主页时没有 问题 ,返回正常,但是在访问在主页提取到的 url 时出现了400状态码(400 Bad Request)。 先贴出结论来,如果 url 里有 空格 的话,要把 空格 替换成 ,也就是 url 编码,否则就会出现400。 首先百度了一下400状态码什么意思: 400页面是当用户在打开网页时,返回给用户界面 有400提示符的页面。其含义是你访问的页面域名不存在或者请求错误。 主要有两种形式: 1、bad request意思是“错误的请求”; 2、invalid hostname意思是 这个时候,出现了encodeURIComponent、decodeURIComponent,它可以完全的对 URL 进行编码解码,但是遇到例如搜索引擎用到的部分转码,又摸不到门了,没 问题 ,PHP官方出了一个解决方案: 代码如下: decodeURIComponent((str + ”).replace(/\+/g, ‘ ’)); 他可以完美的对搜索引擎的地址进行解码,因为搜索引擎只习惯对” 空格 “进行转码。忘了说还习惯对中文进行转码。。。 那以上所有的方案遇到中文就崩溃了,是的,我也崩溃了,即是部分编码,又是中文。。这让我情何以堪。。。 查了很久可以,不多说你懂的。。。 代码如下: <sc url 即统一资源定位符,是通用资源标志符URI的一种。 由于有效的URI中不能包含某些字符,如 空格 等,如果不利用相应编码函数对URI进行编码(浏览器会对相应的 URL 进行处理),那么无法访问到有效的资源。 java script的Global对象( java script的内置对象)中有四个URI方法,分别是encodeURI和decodeURI,encodeURIComponent和decodeURIComponent,浏览器模型(BOM)提供了escape和unescape。在实际应用中,URI方法更可取,因为URI方法会对所有的Unicode符号编码,而BOM提供的escape和unescape %m.pX或%-m.pX格式 - 这里m、p都是整数,X是字母,p若要省去,m与p之间的.也要省去。 m - 最小字段宽度,指定了要显示的最少字符数量,如果要显示的数值所需字符少于m,那么值在字段内右对齐(m前加 - 时,是左对齐),多余字符位置放置 空格 ;如果要显示的值所需字符多于m,那么字段宽度会自动扩展为所需尺寸。 p - 精度,很难表述,依赖于转换说明符X的选择。 %d 有符号10进制整数; %i 有符号10进制整数; %F/f 浮点数; %E/e 用科学表示格式的浮点数; %g... 使用Fiddler抓取接口显示如下:看到某个字段值为“%3D”,我一开始以为就是值,所以一直尝试不成功最后才发现: 空格 - %20 " - %22 # - %23 % - %25 & - %26 ( - %28 ) - %29 + - 我们见到的正常的 url 地址应该是长这个样子的,https://www.baidu.com。但是也有一些 url 地址经过编码了,如长成这样的https%3A%2F%2Fdocument-cdn.yxtxcsq.com%2Fdoc%2Fpdf%2F03%2F000010%2F001636%2F2020%2F03%2F21%2F9e6ddc29c6028b34cd57126f8d1d0c78.pdf%3Fsign%3D6f8799f678c86acb7b5b6802e345c0d5%26t%3D1650180644 Url 参数中出现+、 空格 、=、%、&、#等字符的解决办法 原文链接:http://www.jeffjade.com/2015/04/16/2015-04-16-deal- url -special-char/ Url 出现了有+, 空格 ,/,?,%,#,&,=等特殊符号的时候,可能在服务器端无法获得正确的参数值,抑或是造成不能正常下载文件(作为Download Url 时候),如何是好?解决办法:就是需要将这些字符转化成服务器可以识别的字符;但是为何 Url 中有这些字符就会出现 问题 呢?这就得涉及到 URL %9s表示输出9个字符的字符串,不够9个字符右对齐。如果字符串的长度、或整型数位数超过说明的场宽,将按其实际长度输出。 %8.2f表示输出场宽为8的浮点数,其中小数位为2,整数位为5,小数点占一位,不够8位右对齐。 但对浮点数,若整数部分位数超过