url带中文参数显示乱码的问题

最近要上个项目,其实很简单的东西,就是拼接一个url,不过url中的参数需要UrlEncode编码的,其实对我来说,这个问题很好解决,C#用HttpUtility.UrlEncode来进行编码,asp用Server.UrlEncode来进行编码。

问题解决了吗?问题刚刚开始

因为这个公用转向文件,是针对所有分站的,分站代码有.net和asp两种,文件编码格式也不一样。

头大的事情开始了。asp站的文件编码是gb2312,虽然.net的文件格式也是gb2312,但因为webconfig里设置的requestEncoding是utf8的,所以在接收中文的时候,无论你UrlDeCode怎么解码,哪怕你指定用gb2312解码,出来的还是乱码,那这时候你会说改下webconfig文件呀,不错!如果是你自己的小项目,这样的改动或许不算什么,可如果牵涉到很多项目,在你没办法改的情况下怎么办呢????

先看看例子吧:
环境:
asp:文件名:test.asp 文件编码:gb2312
.net:文件名:test.aspx,test.aspx.cs 文件编码:gb2312
.net:文件名:go.aspx, go.aspx.cs文件编码:gb2312
test.asp 代码:
<%
str 
= Server.UrlEncode("中文测试")
Response.Redirect 
"go.aspx?name=" & str
%
>

test.aspx.cs代码:
string str = HttpUtility.UrlEncode("中文测试");
Response.Redirect(
"go.aspx?name=" + str);
go.aspx.cs代码:
string name = HttpUtility.UrlDeCode(Request["name"], Encoding.GetEncoding("gb2312"));

Response.Redirect(
"http://www.xxx.com?name=
"
 + HttpUtility.UrlEncode(name));
其实在go.aspx.cs中,大家以为编码定到gb2312,应该会正常了,其实错了,我跟踪了一下,在Request["name"]的时候,已经解码,解码的是按照webconfig设置的,那就是utf8。

ok,.Net中,可以指定编码进行url编码,test.aspx.cs可以变成:HttpUtility.UrlEncode("中文测试", Encoding.GetEncoding("utf-8")) 这样go.aspx接收后会完全转换的。

可asp的Server.UrlEncode是没有这个参数的,怎么办呢?
2个办法:
1、把test.asp保存为utf-8编码
2、就是我自己想的一个不是办法的办法。
因为前面说了,我牵涉的项目都是无法更改编码的,如果更改对网站的牵涉太大,所以只能另外想办法。

在做了大量测试后,我发现UrlEncode转码后成为%AB%CD格式,大家都知道UrlEncode在转码英文的时候,会原封不动的还给你,比如你传A,接收方接收的也是A,%会转换成%25,UrlDecode解码的时候%25无论你什么编码,都会解码成%

好,有思路了,假设“中文测试”编码为%AB%CD%EF%GH
str = Server.UrlEncode("中文测试"'%AB%CD%EF%GH
str1 = Server.UrlEncode(Server.UrlEncode("中文测试")) '%25AB%25CD%25EF%25GH

我们再改下go.aspx.cs
Response.Write(HttpUtility.UrlDeCode(Request["str"],Encoding.GetEncoding("gb2312"));

Response.Write(HttpUtility.UrlDeCode(Request[
"str1"],Encoding.GetEncoding("gb2312"));

看下go.aspx页面显示:
第一条会显示乱码
第二条会显示:中文测试

这是什么原因呢?因为在Request的时候,因为webconfig的关系,事先已经按照utf8来进行解码了,所以你再用指定格式解码已经无济于事了。
第二个为什么可以呢?因为我2次编码了,所以Request的时候,会事先解码成:%AB%CD%EF%GH
所以我在用UrlDecode来进行解码,OK!任务完成。

虽然我这个问题不是什么大问题,但有时候真的会让你感到头疼,为了这个问题,花了我3个小时,网上也没有任何解答,所以写下来,希望对大家有所帮助8cad0260
posted @ 2008-01-12 01:38 玄天尊的小屋 阅读(3031) 评论(15)  编辑 收藏 网摘 所属分类: C#随笔

  回复  引用  查看    
#1楼 2008-01-12 08:02 | kwklover      
try this :

NameValueCollection gb2312Requests;
gb2312Requests = HttpUtility.ParseQueryString(Request.Url.Query, Encoding.GetEncoding("GB2312"))
Response.Write(gb2312Requests["string"]); //'里面的string就是你提交的参数的Key

more :
http://www.cnblogs.com/kwklover/archive/2007/10/10/919759.html

  回复  引用  查看    
#2楼 2008-01-12 08:55 | 破曉之陽      
不錯。

  回复  引用  查看    
#3楼 2008-01-12 09:26 | Yok      
最好的办法是移民。。。。
  回复  引用  查看    
#4楼 2008-01-12 10:49 | 一叶小舟      
好办法,去尝试一下。
  回复  引用    
#5楼 2008-01-12 11:01 | lasu [未注册用户]
两个ASP站点,A站是UTF8的,B站是GB2312的
从B传参数到A,我用JS的escape来代替Server.URLEncode
  回复  引用  查看    
#6楼 2008-01-12 11:10 | 远航      
嗯不错,我也为这个事头疼过.
  回复  引用    
#7楼 2008-01-12 13:33 | 陆正 [未注册用户]
根本不行啊
  回复  引用    
#8楼 2008-01-12 23:53 | S.Sams2 [未注册用户]
其实一直都用这种啦. HttpUtility.ParseQueryString(Request.Url.Query, Encoding.GetEncoding("GB2312"))
跟一楼说的一样啦.
  回复  引用  查看    
#9楼 [楼主]2008-01-13 01:16 | inday      
@kwklover
Thanks~回头我去试一下,比我用的简单多了~
  回复  引用    
#10楼 2008-03-03 17:48 | Mon [未注册用户]
Thanks!
  回复  引用    
#11楼 2008-08-28 17:01 | xipiyou [未注册用户]
谢谢楼主!楼主真是好人
  回复  引用  查看    
#12楼 2008-12-04 18:10 | 王国金      
不可以啊。楼主。
我现在是UTF8的项目。然后我在URL上面直接输入
http://localhost:2182/Default.aspx?t=中文测试

以上是代码
string t = Request["t"];
string t1 = Server.UrlEncode(Server.UrlEncode(t));
string t2 = HttpUtility.UrlDecode(t1, Encoding.GetEncoding("GB2312"));
Response.Write(t + "||t1--" + t1 + "||t2---" + t2 + "<br/>");
结果:
���IJ���||t1--%25ef%25bf%25bd%25ef%25bf%25bd%25ef%25bf%25bd%25c4%25b2%25ef%25bf%25bd%25ef%25bf%25bd%25ef%25bf%25bd||t2---%ef%bf%bd%ef%bf%bd%ef%bf%bd%c4%b2%ef%bf%bd%ef%bf%bd%ef%bf%bd
我想请教楼主是怎么搞定的。

  回复  引用  查看    
#13楼 2008-12-04 18:12 | 王国金      
如果说传的时候,先urlencode过来。然后再urldecode.这个当然可以正常显示。
如果直接在URL输入中文,我想请问楼主有没有遇到过
  回复  引用  查看    
#14楼 [楼主]2008-12-04 23:10 | 玄天尊的小屋      
@王国金
我试了2个小时,还是不行,直接输入中文的话,在页面载入的时候,已经被utf8编码了,因为没有找到编码字库,所以出现了个统一的乱码,这时候再靠转换函数来进行解码都于事无补了

我想一般情况是不会让用户来输入url的,我做到现在,还没有遇到过,不知您在什么情况碰到的?
  回复  引用  查看    
#15楼 2008-12-04 23:16 | 王国金      
这个在合作商合作时会遇到。比如在做手机接口时。一般对方是GBK的多。他们是根据移动SP商来做接口的。一般都是直接通过URL传汉字消息,而且是不做转码,我现在就是遇到这个问题。我现在采用的是在子文件夹中再建一个webconfig文件。然后设里面的编码。
这个问题我也搞了一个下午。。重写了httpModules也没有用。现在只能用这个建webconfig来解决了。呵呵。


标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2008-01-12 02:12 编辑过
Google站内搜索
[推荐职位]上海盛大网络招聘架构师



China-pub 计算机图书网上专卖店!6.5万品种 2-8折!
近千种 9-95 新二手计算图书火热销售中!
开发者征途系统新作:《设计模式——基于C#的工程化实现及扩展》

相关文章:

相关链接: