c#编码、解码 -凯发k8官方网
1、httputility.urlencode 方法:
对 url 字符串进行编码,以便实现从 web 服务器到客户端的可靠的 http 传输。重载列表:
[1]将字节数组转换为已编码的 url 字符。 [c#] public static string urlencode(byte[]);
[2]对 url 字符串进行编码。 [c#] public static string urlencode(string);
[3]使用指定的编码对象对 url 字符串进行编码。 [c#] public static string urlencode(string, encoding);
[4]从数组中的指定位置开始一直到指定的字节数为止,将字节数组转换为 url 编码的字符串。 [c#] public static string urlencode(byte[], int, int);
2、httputility.urldecode 方法:
将已经为在 url 中传输而编码的字符串转换为解码的字符串。重载列表:
[1][c#] public static string urldecode(string);
[2]使用指定的解码对象将 url 编码的字节数组转换为已解码的字符串。 [c#] public static string urldecode(byte[], encoding);
[3]使用指定的编码对象将 url 编码的字符串转换为已解码的字符串。 [c#] public static string urldecode(string, encoding);
[4]使用指定的编码对象,从数组中的指定位置开始到指定的字节数为止,将 url 编码的字节数组转换为已解码的字符串。
[c#] public static string urldecode(byte[], int, int, encoding);
3、server是httpserverutility类的实例,是system.web.ui.page的属性。
httpserverutility.urlencode 方法:
编码字符串,以便通过 url 从 web 服务器到客户端进行可靠的 http 传输。重载列表:
[1]对字符串进行 url 编码,并返回已编码的字符串。 [c#] public string urlencode(string);
[2]url 对字符串进行编码,并将结果输出发送到 textwriter 输出流。 [c#] public void urlencode(string, textwriter);
例: string str= "中国";
stringwriter writer = new stringwriter();
server.urlencode(str, writer);
string encodedstring = writer.tostring();
4、httpserverutility.urldecode 方法:
对字符串进行解码,该字符串为了进行 http 传输而进行编码并在 url 中发送到服务器。重载列表 :
[1]对字符串进行 url 解码并返回已解码的字符串。 [c#] public string urldecode(string);
[2]对在 url 中接收的 html 字符串进行解码,并将结果输出发送到 textwriter 输出流。 [c#] public void urldecode(string, textwriter);
注意:
1、httputility.urlencode,httputility.urldecode是静态方法,而server.urlencode,server.urldecode是实例方法。
2、server是httpserverutility类的实例,是system.web.ui.page的属性。
3、用httputility.urlencode编码后的字符串和用server.urlencode进行编码后的字符串对象不一样:
例如: string url="http://localhost:4349/name=中国";
response.write(httputility.urlencode(url));
response.write("
");
response.write(server.urlencode(url));
输出结果是:
http://localhost:4349/name=中国
http%3a%2f%2flocalhost%3a4349%2fname%3d%e4%b8%ad%e5%9b%bd
原因:server.urlencode的编码方式是按照本地程序设置的编码方式进行编码的,而httputility.urlencode是默认的按照.net的utf-8格式进行编码的。
如果改一下程序: string url="http://localhost:4349/name=中国";
response.write(httputility.urlencode(url,system.text.encoding.getencoding("gb2312")));
response.write("
");
response.write(server.urlencode(url));
输出的结果是:
http%3a%2f%2flocalhost%3a4349%2fname%3d%e4%b8%ad%e5%9b%bd
http%3a%2f%2flocalhost%3a4349%2fname%3d%e4%b8%ad%e5%9b%bd
4、有时候可能别的系统传递过来的url是用别的编码方式编码的。 介绍一个方法,可以获取指定编码格式的querystring。
public string getnonnullquerystring(string key,encoding encoding) {//引用system.collections.specialized和system.text命名空间string stringvalue;system.collections.specialized.namevaluecollection encodingquerystring;//该方法是在2.0中新增的encodingquerystring = httputility.parsequerystring(request.url.query,encoding);//'里面的key就是你提交的参数的keyreturn encodingquerystring[key] != null ? encodingquerystring[key].trim() : ""; }调用: string url = getnonnullquerystring("url",encoding.utf8).trim();
在对url进行编码时,该用哪一个?这两都使用上有什么区别吗?
测试: string file="文件上(传)篇.doc"; string server_urlencode=server.urlencode(file); string server_urldecode=server.urldecode(server_urlencode); string httputility_urlencode=system.web.httputility.urlencode(file); string httputility_urldecode=system.web.httputility.urldecode(httputility_urlencode); response.write("原数据:" file); sfun.writeline("server.urlencode:" server_urlencode); sfun.writeline("server.urldecode:" server_urldecode); sfun.writeline("httputility.urlencode:" httputility_urlencode); sfun.writeline("httputility.urldecode:" httputility_urldecode);输出: 原数据:文件上(传)篇.doc server.urlencode:�ļ��ϣ�����ƪ.doc server.urldecode:文件上(传)篇.doc httputility.urlencode:文件上(传)篇.doc httputility.urldecode:文件上(传)篇.doc区别在于:httputility.urlencode()默认是以utf8对url进行编码,而server.urlencode()则以默认的编码对url进行编码。
在用 asp.net 开发页面的时候, 我们常常通过 system.web.httputility.urlencode 和 urldecode 在页面间通过 url 传递参数. 成对的使用 encode 和 decode 是没有问题的.
但是, 我们在编写文件下载的页面的时候, 常常用如下方法来指定下载的文件的名称: response.addheader("content-disposition","attachment; filename=" httputility.urlencode(filename, encoding.utf8)); 之所以转换成 utf8 是为了支持中文文件名.
出现问题:
因为 httputility.urlencode 在 encode 的时候, 将空格转换成加号(' '), 在 decode 的时候将加号转为空格, 但是浏览器是不能理解加号为空格的, 所以如果文件名包含了空格, 在浏览器下载得到的文件, 空格就变成了加号.
解决办法:
在 httputility 的 urlencode 之后, 将 " " 替换成 " "( 如果原来是 " " 则被转换成 "+" ) , 如:
filename = httputility.urlencode(filename, encoding.utf8);
filename = filename.replace(" ", " ");
不明白微软为什么要把空格转换成加号而不是" ". 记得 jdk 的 urlencoder 是将空格转换成 " "的. 经检查, 在 .net 2.0 也是这样.
总结
- 上一篇:
- 下一篇: php扩展开发 - 构建第一个php扩展