=波波日志 > Asp.Net/C#/WCF > 用IHttpModule解决输入中文地址乱码问题(一)=
[转]用IHttpModule解决输入中文地址乱码问题(一)
测试环境:
服务器 —— [本机] WIindows2003 Enterprise Edition 2003 sp2 中文版本,IIS 6.0,IE 7.0,ASP.NET 2.0
客户端 —— [本机] 同上,Firefox 2.0.0.12
作者:birdshover
本文是初步探讨文章。需要做一下几个假设:
1、网站采用的是ASP.NET部署的;
2、网站的编码是UTF-8的;
3、修改页面链接是成本很小的。
现在面临的主要问题是,页面内有很多链接,参数直接带的就是中文,这样比URL转码后的地址友好。但是,当甲用户把觉得不错的地址发送给好友乙时,问题,出现了,参数将会变成乱码!
事实上在UTF-8环境下,网站上页面的链接是可以为中文的,例如:
<a href="http://localhost/a.aspx?key=就是中文">http://localhost/a.aspx?key=就是中文</a>
但是,复制“http://localhost/a.aspx?key=就是中文”直接敲入地址栏,将会产生乱码。
本文旨在解决地址栏输入中文时出现的问题,这种处理方式简单,但是会与已有链接造成冲突。避免冲突的方法,比较复杂,后续文章将会介绍。
利用.net httpmodule重写,可以解决以上问题。
构造HttpModule如下:
配置完成后,在地址栏直接输入“http://localhost/a.aspx?key=就是中文”发现已经不产生乱码(IE,TheWorld 2.0)。
但是当在Firefox中敲入以上地址时,发现还是变成了乱码。
那是因为Firefox会强行给地址进行URL编码。把上述代码改造成:
OK,问题解决了,在三种浏览器中都实现了正常显示。
看到这里不要结束,因为问题有可能已经产生了。
你会发现点击<a href="http://localhost/a.aspx?key=就是中文">http://localhost/a.aspx?key=就是中文</a>
这种地址时,反而变成了乱码。
在本文中的解决方法是,把地址编码
System.Web.HttpUtility.UrlEncode("就是中文",Encoding.GetEncoding("gb2312"))
这样就没有乱码的问题了。
注意,上述代码使用Encoding.Default是因为我的系统是中文版本的,因此默认编码就是gb2312.
全文完。
原文出自:http://www.cnblogs.com/birdshover/
服务器 —— [本机] WIindows2003 Enterprise Edition 2003 sp2 中文版本,IIS 6.0,IE 7.0,ASP.NET 2.0
客户端 —— [本机] 同上,Firefox 2.0.0.12
作者:birdshover
本文是初步探讨文章。需要做一下几个假设:
1、网站采用的是ASP.NET部署的;
2、网站的编码是UTF-8的;
3、修改页面链接是成本很小的。
现在面临的主要问题是,页面内有很多链接,参数直接带的就是中文,这样比URL转码后的地址友好。但是,当甲用户把觉得不错的地址发送给好友乙时,问题,出现了,参数将会变成乱码!
事实上在UTF-8环境下,网站上页面的链接是可以为中文的,例如:
<a href="http://localhost/a.aspx?key=就是中文">http://localhost/a.aspx?key=就是中文</a>
但是,复制“http://localhost/a.aspx?key=就是中文”直接敲入地址栏,将会产生乱码。
本文旨在解决地址栏输入中文时出现的问题,这种处理方式简单,但是会与已有链接造成冲突。避免冲突的方法,比较复杂,后续文章将会介绍。
利用.net httpmodule重写,可以解决以上问题。
构造HttpModule如下:
public class HookModule : IHttpModule
{
#region IHttpModule 成员
public void Dispose()
{
}
public void Init(HttpApplication context)
{
context.BeginRequest += new EventHandler(context_BeginRequest);
}
void context_BeginRequest(object sender, EventArgs e)
{
HttpApplication application = (HttpApplication)sender;
HttpContext context = application.Context;
string rawurl = context.Request.RawUrl;
context.RewritePath(rawurl);
}
#endregion
}
{
#region IHttpModule 成员
public void Dispose()
{
}
public void Init(HttpApplication context)
{
context.BeginRequest += new EventHandler(context_BeginRequest);
}
void context_BeginRequest(object sender, EventArgs e)
{
HttpApplication application = (HttpApplication)sender;
HttpContext context = application.Context;
string rawurl = context.Request.RawUrl;
context.RewritePath(rawurl);
}
#endregion
}
配置完成后,在地址栏直接输入“http://localhost/a.aspx?key=就是中文”发现已经不产生乱码(IE,TheWorld 2.0)。
但是当在Firefox中敲入以上地址时,发现还是变成了乱码。
那是因为Firefox会强行给地址进行URL编码。把上述代码改造成:
public class HookModule : IHttpModule
{
#region IHttpModule 成员
public void Dispose()
{
}
public void Init(HttpApplication context)
{
context.BeginRequest += new EventHandler(context_BeginRequest);
}
void context_BeginRequest(object sender, EventArgs e)
{
HttpApplication application = (HttpApplication)sender;
HttpContext context = application.Context;
string rawurl = context.Request.RawUrl;
byte[] bytes = System.Web.HttpUtility.UrlDecodeToBytes(rawurl, Encoding.Default);
string s = Encoding.Default.GetString(bytes);
context.RewritePath(s);
}
#endregion
}
{
#region IHttpModule 成员
public void Dispose()
{
}
public void Init(HttpApplication context)
{
context.BeginRequest += new EventHandler(context_BeginRequest);
}
void context_BeginRequest(object sender, EventArgs e)
{
HttpApplication application = (HttpApplication)sender;
HttpContext context = application.Context;
string rawurl = context.Request.RawUrl;
byte[] bytes = System.Web.HttpUtility.UrlDecodeToBytes(rawurl, Encoding.Default);
string s = Encoding.Default.GetString(bytes);
context.RewritePath(s);
}
#endregion
}
OK,问题解决了,在三种浏览器中都实现了正常显示。
看到这里不要结束,因为问题有可能已经产生了。
你会发现点击<a href="http://localhost/a.aspx?key=就是中文">http://localhost/a.aspx?key=就是中文</a>
这种地址时,反而变成了乱码。
在本文中的解决方法是,把地址编码
System.Web.HttpUtility.UrlEncode("就是中文",Encoding.GetEncoding("gb2312"))
这样就没有乱码的问题了。
注意,上述代码使用Encoding.Default是因为我的系统是中文版本的,因此默认编码就是gb2312.
全文完。
原文出自:http://www.cnblogs.com/birdshover/
类别:Asp.Net/C#/WCF 作者:转载 日期:2009-09-01 【评论:0】
相关文章
- ·用IHttpModule解决输入中文地址乱码问题(二)
- ·asp.net(C#)中文乱码问题
- ·非重新命名--解决fckeditor编辑器Asp.NET上传文件中文文件名出现乱码问题
- ·AJAX中文乱码PHP完美解决(IE和Firefox兼容)
- ·在FireFox浏览器中asp.net+AJAX传输的中文字符串到服务器端后乱码的问题!!!!
- ·MVC框架的地址重写(一)——MVC中默认的地址重写
- ·编辑器的输入焦点问题
- ·解决无法显示隐藏文件的问题
- ·如何解决ajax跨域的问题
- ·自己用IHttpModule接口写的URL重写组件
- ·lucene.net 2.0 中文分词后语法高亮问题
- ·解决js中onMouseOut事件冒泡的问题
暂时没有评论!
发表留言
热门博文
- IE里Cookie跨域不能读取
- web服务因URL意外地以/**结束,请求格式无法识别
- 去掉隐藏asp.net编译出错aspxerrorpath错误参数
- 解决asp.net验证视图状态 MAC 失败
- 找不到System.Web.Script.Services.ScriptService
- 在aspx,ashx页面挂起线程执行
最新博文
- WCF利用限流(Throttling)控制并发访问[下篇]
- WCF利用限流(Throttling)控制并发访问[上篇]
- ConcurrencyMode.Multiple模式下的WCF服务同步上下文对并发的影响[下篇]
- ConcurrencyMode.Multiple模式下的WCF服务同步上下文对并发的影响[上篇]
- WCF基于ConcurrencyMode.Reentrant模式下的并发控制机制
- C#如何设置标记方法等为否决的不可用
随机博文
- ASP.NET Web.config配置详解
- C#如何实现语音发音
- 14.5 Web服务(Web Service)
- C#实现重启、关闭局域网计算机
- asp.net如何实现断点续传文件下载
- DataTable Compute方法
广告商赞助

