urlencode特殊字符,urlencode 加号
php urlencode 特殊字符
看一下手册。
Note:
注意:小心与 HTML 实体相匹配的变量。像 amp、copy 和 pound 都将被浏览器解析,并使用实际实体替代所期待的变量名。这是明显的混乱,W3C 已经告诫人们好几年了。参考地址:? 。
PHP 通过 arg_separator.ini 指令,支持将参数分割符变成 W3C 所建议的分号。不幸的是大多数用户代理并不发送分号分隔符格式的表单数据。较为简单的解决办法是使用 代替 作为分隔符。你不需要为此修改 PHP 的 arg_separator。让它仍为 ,而仅使用 htmlentities() 或 htmlspecialchars() 对你的 URL 进行编码。
url含特殊字符怎么办
可以进行转码处理。
url地址可以使用经过编码的地址,一般可以用urlencode等类似方法进行转码。如果服务器端可以处理特殊地址,也可以使用其他的编码方法,然后访问的时候进行解码跳转。
urlencode进行转换后 为什么空格是+号 不是%20
可以看看PHP的函数?urlencode() 和 rawurlencode()?函数的实现方式,第二个是raw转换,会把对应的空格更换成 %20 的编码方式。
%20 是空格的 URL 字符编码。
[ol][*] [*]$new_true_url = iconv(\'gbk\',\'utf-8\',$true_url);
[*]$down_true_url =??urlencode($new_true_url);
[*]$down_true_url =?str_replace(\"%3A%2F%2F\", \"://\", $down_tr。
使用编码函数就可以将特定字符转换成规定的字符编码,包括空格等。解码函数功能刚好相反。参数是需要处理的字符串,返回值是处理好的字符串。不过这些函数作用都有差异,详细内容可以自己查看资料。
扩展资料:
编码原理:
将需要转码的字符转为16进制,然后从右到左,取4位(不足4位直接处理),每2位做一位,前面加上%,编码成%XY格式。
比如:
空格ASCII码是32,对应16进制是20,那么urlencode编码结果是:%20,但在新标准中空格对应的是+,见RFC-1738
比如:
中ASCII码是-10544,对应的16进制是D6D0,那么urlencode编码结果是:%D6%D0。
参考资料来源:百度百科-urlencode
Base64和urlencode
使用base64的初衷。是为了方便把含有不可见字符串的信息用可见字符串表示出来
我们知道在计算机中任何数据都是按ascii码存储的,而ascii码的128~255之间的值是不可见字符。
而在网络上交换数据时,比如说从A地传到B地,往往要经过多个路由设备,由于不同的设备对字符的处理方式有一些不同,这样那些不可见字符就有可能被处理错误,这是不利于传输的。所以就先把数据先做一个Base64编码,统统变成可见字符,这样出错的可能性就大降低了。
urlencode
url编码主要是为了解决一些url中的一些特殊字符和歧义字符或者中文字符的传输问题,
1. base64编码里面有一个 “+” 号,在urlecode编码中 “+” 会被解码成空格,urlencode时,"+" 号肯定是由空格编码出来的,但是base64编码的结果中 "+" 不是空格编码出来的,如果将base64编码作为安全的url编码使用,则 “+” 将被解码成空格,这是我们不愿看到的; 所以不要base64编码作为url编码来使用.
2. 我们知道http头里面可能会用base64编码来传输一些信息,因为这些信息不会被web服务器默认做url解码的,我们可以得到原始的编码信息, 所以http头里面使用base64编码是可以接受的 。
用base64编码后再进行URL编码,再传输可能会避免此类问题。
Base64编码将二进制数据按照每三个字节转换成四个字节可读字符,编码后的字符长度大约为136.1%。字符范围为 A-Z a-z 0-9 \ +。但编码后的字符串不太适合使用URL传输,中文加密后的乱码也多是因为这个原因引起:放在url中传输时+号会被替换成空格;并且每76个字符都会添加一个换行"\n",这个换行符合会丢失。
例如:
哈哈哈哈哈哈。。。。
会被编码为:
uf65/rn+uf65/rn+oaOho6GjDQoNCrn+uf65/rn+uf65/qGjoaOhow0KDQq5/rn+uf65/rn+uf6h\no6GjoaM=
放在URL中传输时会变成(不是urlencode的意思,并没有urlencode)
uf65/rn uf65/rn oaOho6GjDQoNCrn uf65/rn uf65/qGjoaOhow0KDQq5/rn uf65/rn uf6h
o6GjoaM=
解析肯定会出问题。
所以在传输和解密时要做如下处理:
1.去掉\n
2.替换空格为+
获取到的请求数据
eyJqb3NfcGFyYW1ldGVycyI6eyJhcHBfa2V5IjoiNDUyNDJFMkU0QjA3RTNCODcyRDExNjM1MTUyRjY1MzIiLCJlbmRfZGF0ZSI6MTQ2OTgwODAwMDAwMCwiaXRlbV9jb2RlIjoiRldfR09PRFMtNDY4MTAtMSIsInVzZXJfbmFtZSI6IueIseWxi awj WumOaWueaXl iIsOW6lyIsInZlcnNpb25fbm8iOjF9fQ==
Base64编码 使用的字符包括大小写字母各26个,加上10个数字,和加号“+”,斜杠“/”,一共64个字符,等号“=”用来作为后缀用途。
其中的+, /, = 都是需要urlencode的,所以无法取代。
不能,base64有转码功能:
由于 ASCII 码称为了国际标准,所以我们要把其它字符转成 ASCII 就要用到 base64。
utf-8 - base64(编码) - ASCII
ASCII - base64(解码) - utf-8
这样就可以让只支持 ASCII 的计算机支持 utf-8 了。
参考: