FCL小应用系列-----------如何实现URLEncoded编码与解码

1.URLEncoed编码使用场景

在Http协议的请求URI,协议标头,POST的窗体数据中,必须采用UrlEncoded编码方式。

 

2.何为URLEncoed编码

URLEncoded编码中,所有的字符均为ANSCII码。编码原理如下:编码前的所有字符可以分成两类,(1)安全字符;(2)不安全字符。

        对于安全字符,其必然是ANSCII码,但是ANSCII码不全是安全字符。安全字符在转变过程中不变化,仍为ANSCII。

        对于安全字符,包括所有的非ANSCII字符和部分ANSCII字符,采用(%原字符十六进制表示)组成。如:GB2312编码的“登”,URLEncoded编码后为“%B5%C7”。而UTF8编码的“登”,URLEncoded后为"%e7%99%bb"。还有一些特殊,如空格被变为"+"。

 

3 如何实现?

如果从头实现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)

 

你可能感兴趣的:(FCL小应用系列-----------如何实现URLEncoded编码与解码)