前些时间做了个文件下载的应用,由于中文名文件的原因,所以在拼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位右对齐。
但对浮点数,若整数部分位数超过