您的位置:首页 > 理论基础 > 计算机网络

http url转义字符,特殊字符

2016-02-18 14:31 1846 查看
空格 - %20
" - %22
# - %23
% - %25
& - %26
( - %28
) - %29
+ - %2B
, - %2C
/ - %2F
: - %3A
; - %3B
< - %3C
= - %3D
> - %3E
? - %3F
@ - %40
\ - %5C
| - %7C

URL中传递加号等特殊字符
url 中有些字符被转义,比如空格被编码成加号,于是传的参数明明是加号,获取的值却成了空格。如何解决呢?如果是通过 url 传递参数,应该对其进行必要的编码。

解决办法:

在 javascript 中加入
  function URLencode(sStr) { return escape(sStr).replace(/\+/g, '%2B').replace(/\"/g,'%22').replace(/\'/g, '%27').replace(/\//g,'%2F'); }

对字符串进行处理.如:
  var str=URLencode("abc+");

或者:
  dst_fname=dst_fname.replaceAll("\\+","%20");
关于http的RFC文档:http://www.w3.org/Protocols/rfc2616/rfc2616.html
关于http与中文传输的问题,如果不解决,在实际的网络抓取的过程中会产生很多的次生的问题。理解中文传输的编码过程因而尤为重要。

中文的传输过程具体可能是:内存中unicode -> 编码阶段gbk, gb18030, utf8 -> 到urlencode ->最后到可能的base64编码。那到底是什么机制在负责这个转换的过程呢?转换使用的是什么通道呢?
UrlEncode:将字符串以URL编码 。 返回值:字符串。 函数种类:编码处理。比如在谷歌搜索“中国人”的时候,得到的URL如下所示:http://www.google.com.hk/search?q=%D6%D0%B9%FA%C8%CB&client=aff-360daohang&hl=zh-CN&ie=gb2312&newwindow=1,其中%D6%D0%B9%FA%C8%CB部分就是urlencode。那么这个编码的处理方式是怎么样的呢?有没有什么处理工具?

个人尝试的方法就是:
无论如何都把urlencode转化成Utf-8的格式进行数据传输。例如下例:id=java.net.URLEncoder.encode(id, "utf-8");
然后再接受就可以了。urlencoder时必须合并使用的方法。
id=java.net.URLEncoder.encode(id, "utf-8");
response.sendRedirect("personalPage.jsp?user="+id);

尝试成功之后,还有一种情况没有考虑到,那就是gb2312编码格式下中文字符的直接传输。能否不经过utf-8的编码来搞定参数的传递?

附一些自己找到的资料:

UrlEncode编码

主要用于将字符串以URL编码,返回一个字符串。
使用方法:
1、ASP中的用法:Server.URLEncode(“内容”) 例如:
<% response.write Server.UrlEncode("工具网") %>
2、PHP中的用法:urlencode(“内容”) 例如:
<? echo urlencode("工具网")?>
3、JSP中的用法:URLEncoder.encode(“内容”) 例如:
<% java.net.URLEncoder.encode("工具网"); %>
个人亲自尝试的中文传输方法,即只需编码,另一端无需解码:
<%
id=java.net.URLEncoder.encode(id, "UTF-8");
response.sendRedirect("/index.jsp?error="+id);
%>
4、javascript中的用法:encodeURI(“内容”) 例如:
encodeURI("工具网");
5、Python中的用法:
import urllib2
urllib2.quote("工具网")
UrlDecode解码
主要对字符串进行URL解码,返回已解码的字符串
1、ASP中的用法:Server.UrlDecode(“内容”) 例如:
<% response.write Server.UrlDecode("%E5%B7%A5%E5%85%B7%E7%BD%91") %>
2、PHP中的用法:urldecode(“内容”) 例如:
<? echo urldecode("%E5%B7%A5%E5%85%B7%E7%BD%91")?>
3、JSP中的用法:URLDecoder.decode(“内容”) 例如:
<% java.net.URLDecoder.decode("%E5%B7%A5%E5%85%B7%E7%BD%91"); %>
4、javascript中的用法 例如:
decodeURI("%E5%B7%A5%E5%85%B7%E7%BD%91");
5、Python中的用法 例如:
import urllib2
urllib2.unquote("%E5%B7%A5%E5%85%B7%E7%BD%91")
Gb2312及Gb2312转Utf-8编码的UrlEncode编码解码
Unicode 与 Utf-8码间的内码规则模板为:
原始码(16进制) UTF-8编码(二进制)
--------------------------------------------
0000 - 007F 0xxxxxxx
0080 - 07FF 110xxxxx 10xxxxxx
0800 - FFFF 1110xxxx 10xxxxxx 10xxxxxx (中文字在此区间)
……
--------------------------------------------
例如:
百度中查询“中国人”,会将中文URL参数转为Gb2312码的16进制表示,一个中文字用2个字节
http://www.baidu.com/s?wd=%D6%D0%B9%FA%C8%CB
Google中查询“中国人”,会将中文URL参数转为Utf-8编码的16进制表示,一个中文字用3个字节
http://www.google.cn/search?client=opera&rls=en&q=%E4%B8%AD%E5%9B%BD%E4%BA%BA&sourceid=opera&ie=utf-8&oe=utf-8
Objective-C 对 URL 进行 URLEncode 编码
在为Apple的IPhone、ipad等设备开发iOS app应用程序访问 HTTP 资源时需要对 URL 进行 Encode,比如像拼出来的 http://www.baidu.com/s?wd=中国人,其中的中国人、 特殊符号&%和空格都必须进行转译才能正确访问。
在 Java、.net 和 JS 中都有相应的 encodeURL 方法可用,在 Objective-C 语言中,你可以试下
- (NSString *)stringByAddingPercentEscapesUsingEncoding:(NSStringEncoding)enc;
来对完整的 URL(带请求参数的)进行编码,比如执行下面的代码:
NSString *url=@"http://www.baidu.com/s?wd=中国人";
NSString *encodedValue = [url stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
上面代码转换出的 encodedValue 是: http://www.baidu.com/s?wd=%D6%D0%B9%FA%C8%CB 可见,它不会转换 URL 中的 ?%& 符号,这也正常,因为它肯定分不出哪个 & 是参数的连接符号还是参数值,你可以单独编码参数,然后在拼接成 URL 之前把属性参数值中的 ?%& 等符号分别替换成相应的编码。
base64的编码方式:
Base64 c#加密函数
C#代码

public static string Encrypt(string pToEncrypt)
{
byte[] barray=System.Text.UnicodeEncoding.Unicode.GetBytes(pToEncrypt);

return Convert.ToBase64String(barray);
}

Base64 c#解密函数

C#代码

public string Decrypt(string pToDecrypt)
{

byte[] mingwen = Convert.FromBase64String(pToDecrypt);

string str = System.Text.UnicodeEncoding.Unicode.GetString(mingwen);

return str;

}

加密后的字符串如果存在"/" "+" "=", 在WEB的传输过程中(含有request之类动作)会发生改变,分别对应为
“/” 在客户端变为 "2F"
"+" ..........." "
"=" ..........."%3D"
所以在客户端对字符串解密前应该恢复为正确的base64码,下面是asp中的编码

Java代码

str=Replace(str," ","+")
str=Replace(str,"%2F","/")
str=Replace(str,"%3D","=")
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: