犬者
“说了你又不听,听又不懂,懂又不做,做又做错,错又不认,认又不改,改又不服,不服也不说,那叫我怎么办?!”

【电脑】解UrlPathEncode的字符串的噩梦

我个人比较喜欢用gb2312做网站,web.config中一直都是使用:
<?xml version="1.0" encoding="gb2312" ?>
<globalization requestEncoding="gb2312" responseEncoding="gb2312" />

然后,噩梦便开始了……

做一个最简单的页面:
<%
Response.
Write(Server.UrlDecode(Server.UrlPathEncode("两性")) & "<hr>")
Response.
Write(HttpUtility.UrlDecode(Server.UrlPathEncode("两性"), Encoding.UTF8) & "<hr>")
%
>


因为做了全局设定为gb2312,所以
Server.UrlDecode(String)
实际上是等价于
HttpUtility.UrlDecode(Server.UrlPathEncode(String),  Encoding.GetEncoding("gb2312"))

但是,该死的Server.UrlPathEncode(String)永远是将传入的字符串按照utf-8去编码,“两性”对应的编码为:
%e4%b8%a4%e6%80%a7

试试google的解码:http://www.google.com/search?q=%e4%b8%a4%e6%80%a7

google的解码是完全正确的。

但是,在页面编码为gb2312的情况下:
Server.UrlDecode(Server.UrlPathEncode("两性"))
出来之后是乱码,因为Server.UrlDecode出来的是一个utf-8编码的字符串,手动IE编码为utf-8时,是可以看到“两怀”的。

但是,如果是“两性人”的话,则可以正确显示。

尝试过N种字符串,在大部分情况下,偶数个中文都可以正确显示,比方说“数据”,奇数个中文则最后一个字会被砍掉,比方说,“数据库”会变成“数据”。

我前面用“两性”做例子,是因为“两性”是偶数个中文,但是无法正确显示,而相应的“两性人”是奇数个中文,但却可以正常显示。(“人两性”,“性两人”等等也都是会出错。)

编码是正确的,只是,解码有时会出错。

我浪费了无数的时间,企图将这个utf-8的字符串转换为gb2312的格式;都是徒劳的。

我得出来的结果是,UrlDecode这个函数有bug,而且,这个bug似乎很有普遍性。

asp并没有提供UrlDecode的系统函数,我所找到的两个版本的asp UrlDecode函数似乎也都存在类似的问题。

夸张的是看看下面的帖子:
http://www.matrix.org.cn/forum_view.asp?forum_id=1&view_id=14847

在jsp中:http://localhost:8700/acweb/executereport.do?fileName=/批处理摸版本/三参数设置.vtf;1

String fileName=request.getParameter("fileName");
fileName= new String(fileName.getBytes("ISO8859-1"), "utf-8");

结果显示fileName为:/批处理摸版本/三参数设,  丢失:置.vtf;1

将“/批处理摸版本/三参数设置.vtf;1”在asp.net中使用Server.UrlPathEncode之后再Server.UrlDecode,出现了跟jsp一样的错误解码!

http://dev.csdn.net/article/50/50455.shtm说:“MS之前犯的著名URL解码错误

但是,为什么同样的错误Sun也犯?

Well,在asp.net中,不要使用Server.UrlDecode,使用HttpUtility.UrlDecode并使用相应的encoding参数便可以解决问题。

不过,要正确获得:http://localhost/try.aspx?s=%e4%b8%a4%e6%80%a7

还是要浪费一下时间,使用
Request.QueryString(0)
获得的字符串“%e4%b8%a4%e6%80%a7”已经被自动错误解码为utf-8的“两怀”了。

我使用的是类似:
tw = Mid(Request.RawUrl, 15, Request.RawUrl.Length - 13)

的方法来直接获得“%e4%b8%a4%e6%80%a7”,然后再使用HttpUtility.UrlDecode将其解码。

呼呼……在google的时候,几乎没有google出来比较详尽的说明这个解码错误的问题的东西,而且,遇到这样问题的程序员大多数都是在做jsp或者是wap开发的……敢情,做asp.net的,都没有遇到过这样的问题么?

9774
问天 @5/10/2005 8:09:47 AM
View blogs in this category:电脑


小风 在 3/8/2006 6:52:29 PM 说:

那用utf-8做网站比用GB2312有什么缺陷?
aDaNG 在 5/10/2005 2:36:08 PM 说:

我以前在做jsp的时候,在数据库编码的时候遇到过这样的问题。
现在在做asp.net开发,在url 编码的时候还没有遇到过这样的问题。
但是,在ms index server微软索引服务的时候,如果
文本文件的编码不同,那么index服务就找不到相应的字符串。

Please leave your comment here

 
  名字:
  主页:
  内容:
 

   


Navigation
Blogwind
犬者首页
Contact


个人档案


“说了你又不听,听又不懂,懂又不做,做又做错,错又不认,认又不改,改又不服,不服也不说,那叫我怎么办?!”



Categories
死结(27)
电脑(179)
心情(182)
天影(25)
乱弹(212)
博客(82)
音乐(18)
饕餮(31)
读书(20)
电影(30)
网摘(5)
希望(41)
汕头(10)
经济(9)
苹果(19)
跋涉(7)



Archive
2008年12月
2008年11月
2008年10月
2008年9月
2008年8月
2008年7月
2008年6月
2008年5月
2008年4月
2008年3月
2008年2月
2008年1月
2007年12月
2007年11月
2007年10月
2007年9月
2007年8月
2007年7月
2007年6月
2007年5月
2007年4月
2007年3月
2007年2月
2007年1月
2006年12月
2006年11月
2006年10月
2006年9月
2006年8月
2006年7月
2006年6月
2006年5月
2006年4月
2006年3月
2006年2月
2006年1月
2005年12月
2005年11月
2005年10月
2005年9月
2005年8月
2005年7月
2005年6月
2005年5月
2005年4月
2005年3月
2005年2月
2005年1月
2004年12月
2004年11月
2004年10月
2004年9月
2004年8月
2004年7月
2004年6月
2004年5月
2004年4月
2004年3月
2004年2月
2004年1月
2003年12月



My Links
5G
bloglines
时尚摄影师奇科的博客
颜如玉
最爱卫斯理

RSS 2.0

Username:
Password:
 Remember me