在Http协议的请求URI,协议标头,POST的窗体数据中,必须采用UrlEncoded编码方式。
URLEncoded编码中,所有的字符均为ANSCII码。编码原理如下:编码前的所有字符可以分成两类,(1)安全字符;(2)不安全字符。
对于安全字符,其必然是ANSCII码,但是ANSCII码不全是安全字符。安全字符在转变过程中不变化,仍为ANSCII。
对于安全字符,包括所有的非ANSCII字符和部分ANSCII字符,采用(%原字符十六进制表示)组成。如:GB2312编码的“登”,URLEncoded编码后为“%B5%C7”。而UTF8编码的“登”,URLEncoded后为"%e7%99%bb"。还有一些特殊,如空格被变为"+"。
如果从头实现URLEncoded编码,必须熟悉各种编码,相当复杂。幸好System.Web.HttpUtility为我们提供了几个静态函数用于URLEncoed编码。具体如下:
string HttpUtility.UrlEncode(string str, Encoding e);
首先要说明的是在.net的世界里,char和string永远都是采用UNICODE编码。
参数:str,编码前的UNICODE字符串,如"好人hehe";
e,进行编码前,把str中的字符先有UNICODE变为e。e为转换后的编码方式,
如GB2312;
返回值:编码后的字符串的UNICODE表示。什么意思呢?URLEncoded编码为ANSCII编码,但是string是UNICODE,所以string是URLEncoded字符串的UNICODE表示。
string HttpUtility.UrlDecode(string str, Encoding e);
参数: str,URLEncoded编码字符串的UNICODE表示;
e,原来字符串的编码方式,如GB2312,UTF8等。
返回值:解码后的字符串的UNICODE表示。比如如果解码后为GB2312的"登",则实际返回的字符串中包含的是转化为UNICODE的“登”。
需要说明的是,真正在网络上传输的是UrlEncoded字符串流,而不是它的UNICODE表示,然而.net中的大多数API却都是接收UNICODE表示字符串,实际发送时,会自动转化为ANCII版本,所以这种转换程序员不用操心。然而窗体数据需要转化:
StreamWriter sw = new StreamWriter(requsetStream,
Encoding.ASCII); //编码方式
sw.Write(formdata); //写入窗体数据(urlencoded)