asp.net URL中包含中文参数造成乱码的解决方法
程序员文章站
2024-03-08 20:30:34
问题: 前段时间,在系统中做了一个类似于友情链接的功能块,一直运行良好,直到有一天加了类似于以下的链接地址:http://www.****.com/user.aspx?...
问题:
前段时间,在系统中做了一个类似于友情链接的功能块,一直运行良好,直到有一天加了类似于以下的链接地址:http://www.****.com/user.aspx?id=水天,就出现大问题了:
1、从ie地址栏中直接输入这个地址,访问没错;
2、做一个静态页,其中包括这个超链接,点击访问也没错;
3、就是把这个链接添加到这个功能块中,点击访问那边接收到的是乱码。
一开始,被这个问题也搞得头大,在google了一把后,总算是把问题给搞清楚了,其实只要这个链接地址不经过任何编码传递是不会有问题的。但就是加到了这个功能块后,再点击,虽然这个时候在ie地址栏里显示的还是"http://www.****.com/user.aspx?id=水天",但真正传递过去的参数"水天"其实已经经过类似于server.urlencode的操作了,当然默认是utf-8编码,正是由于这个原因,如果对方系统不进行相应的解码,直接操作该参数,就产生了以上的错误。
解决方法:
网上有很多解决之道,最常见的莫过于以下几点:
1、在web.config里配制<globalization requestencoding="gb2312" responseencoding="gb2312" />,这个方法确实可行,但我想很多人不想用这种方法来解决,把整个项目的请求和回应都定为gb2312,我觉得不是一个好办法,有点本末倒置了,毕竟这会导致很多其它问题的出现。
2、把要包含该链接的aspx文档,修改其charset属性为gb2312。这个方法到也可以接受,不过对于该文中的问题还不是最好的方法,因为该功能块是可以动态添加到任何页面的,难道要去修改所有的页面?想想还是不太合适。
3、直接用server.urlencode和server.decode进行加码和解码操作,这种方法对于发送方和接收方都在一个项目中是可行的,现在的问题是,我们要随意去访问别人的系统,所以只能弃用此方法了。
4、采用httputility.urlencode(query, system.text.encoding.getencoding("gb2312"));对链接中的参数值进行gb2312的编码,这种方法,对方不用进行任何解码操作,直接接收参数则不会出现乱码。
一般提到最多的也就上面4种方法,其它的也跟这些大同小异。仔细分析后,觉得还是第4种方法最适合解决当前问题,把中文参数进行如4中的操作。但又出现另外一个问题,由于这是一个用户可以*输入链接地址的功能,所以首先要做的就是得先分析这些链接url,解析出参数,再对这些参数进行4中操作,然后再合拼成原来的url地址。
幸亏,url参数解析c#已经有类库的支持,不用再去写那些复杂的正则表达式来匹配了。这里我也不详细说了,直接贴出原码:
public static string initchineseurl(string chineseurl)
{
uri url = new uri(chineseurl);
system.collections.specialized.namevaluecollection nv = system.web.httputility.parsequerystring(url.query, system.text.encoding.getencoding("utf-8"));
string query = "";
for (int i = 0; i < nv.count; i++)
{
if (query.trim() == string.empty)
{
query = "?" + nv.keys[i] + "=" + httputility.urlencode(nv[i], system.text.encoding.getencoding("gb2312"));
}
else
{
query += "&" + nv.keys[i] + "=" + httputility.urlencode(nv[i], system.text.encoding.getencoding("gb2312"));
}
}
string u = chineseurl.split('?')[0] + query;
return u;
}
这里我是把所有的参数都进行gb2312编码操作了,反正参数如果是英文或者是数字,经过这些操作后还是不变的。
前段时间,在系统中做了一个类似于友情链接的功能块,一直运行良好,直到有一天加了类似于以下的链接地址:http://www.****.com/user.aspx?id=水天,就出现大问题了:
1、从ie地址栏中直接输入这个地址,访问没错;
2、做一个静态页,其中包括这个超链接,点击访问也没错;
3、就是把这个链接添加到这个功能块中,点击访问那边接收到的是乱码。
一开始,被这个问题也搞得头大,在google了一把后,总算是把问题给搞清楚了,其实只要这个链接地址不经过任何编码传递是不会有问题的。但就是加到了这个功能块后,再点击,虽然这个时候在ie地址栏里显示的还是"http://www.****.com/user.aspx?id=水天",但真正传递过去的参数"水天"其实已经经过类似于server.urlencode的操作了,当然默认是utf-8编码,正是由于这个原因,如果对方系统不进行相应的解码,直接操作该参数,就产生了以上的错误。
解决方法:
网上有很多解决之道,最常见的莫过于以下几点:
1、在web.config里配制<globalization requestencoding="gb2312" responseencoding="gb2312" />,这个方法确实可行,但我想很多人不想用这种方法来解决,把整个项目的请求和回应都定为gb2312,我觉得不是一个好办法,有点本末倒置了,毕竟这会导致很多其它问题的出现。
2、把要包含该链接的aspx文档,修改其charset属性为gb2312。这个方法到也可以接受,不过对于该文中的问题还不是最好的方法,因为该功能块是可以动态添加到任何页面的,难道要去修改所有的页面?想想还是不太合适。
3、直接用server.urlencode和server.decode进行加码和解码操作,这种方法对于发送方和接收方都在一个项目中是可行的,现在的问题是,我们要随意去访问别人的系统,所以只能弃用此方法了。
4、采用httputility.urlencode(query, system.text.encoding.getencoding("gb2312"));对链接中的参数值进行gb2312的编码,这种方法,对方不用进行任何解码操作,直接接收参数则不会出现乱码。
一般提到最多的也就上面4种方法,其它的也跟这些大同小异。仔细分析后,觉得还是第4种方法最适合解决当前问题,把中文参数进行如4中的操作。但又出现另外一个问题,由于这是一个用户可以*输入链接地址的功能,所以首先要做的就是得先分析这些链接url,解析出参数,再对这些参数进行4中操作,然后再合拼成原来的url地址。
幸亏,url参数解析c#已经有类库的支持,不用再去写那些复杂的正则表达式来匹配了。这里我也不详细说了,直接贴出原码:
复制代码 代码如下:
public static string initchineseurl(string chineseurl)
{
uri url = new uri(chineseurl);
system.collections.specialized.namevaluecollection nv = system.web.httputility.parsequerystring(url.query, system.text.encoding.getencoding("utf-8"));
string query = "";
for (int i = 0; i < nv.count; i++)
{
if (query.trim() == string.empty)
{
query = "?" + nv.keys[i] + "=" + httputility.urlencode(nv[i], system.text.encoding.getencoding("gb2312"));
}
else
{
query += "&" + nv.keys[i] + "=" + httputility.urlencode(nv[i], system.text.encoding.getencoding("gb2312"));
}
}
string u = chineseurl.split('?')[0] + query;
return u;
}
这里我是把所有的参数都进行gb2312编码操作了,反正参数如果是英文或者是数字,经过这些操作后还是不变的。
上一篇: Java实现验证码具体代码(图片、汉字)