日期:2014-05-17  浏览次数:20997 次

utf-8页和gb2312页参数传递问题
在utf-8页中
<a   href= "http://www.7town.com/1.asp?mn= "张韶涵 "> 张韶涵 </a>

gb2312页中
Response.Write   Request.QueryString( "mn ")
输出就是乱码了,前提下是gb2312页是别的网站的页我没权利改,utf-8页是自己只能在这个页里下功夫编码不能变

------解决方案--------------------
昨天晚上我正好也碰到了这个问题,花了很长时间才找到答案。
如果你看到的乱码是形如 &#x3a7; 这样的编码,那么我的方法就适用你的问题。

Str = Str.Replace( "&#x ", "%u ").Replace( "; ", " ");
Str = Server.UrlDecode(Str);

是用C#写的,转成Vbscript也可以。

原理:先将UTF-8码转成UrlCode,再转到GB2312

我也尝试过UTF-8直接转GB2312的,但总是不成功。

期待高手能贴出直接转的代码。
------解决方案--------------------
问题有些奇怪,调试了一下,有些想法,到底对不对,还请高手指点。

客户端是utf编码,服务器为gb,那么request.querystring获得的是用固定双字节读出得1-3字节utf编码,这可以用adostream转码,代码如下:

set objAs=server.createobject( "adodb.stream ")
objAs.type=2
objAs.mode=3
objAs.open
objAs.Charset= "gb2312 " '以双字节写回,所以用gb
objAs.WriteText Request.QueryString( "mn ")
objAs.Position=0
objAs.Charset= "utf-8 " '以客户端对应的编码方式读取
Response.Write objAs.ReadText '显示

问题:
1、我提交的是 "张韶涵 ",显示的确只有 "张韶 ",为什么?
汉字的utf-8的 "张韶涵 "是9个字节,而服务器端是gb2312只能接受偶数字节,所以server.querystring只返回了8个字节,adostream转换时 "涵 "字因为尾字节丢失而略。

2、为什么有些字串又显示正常,如 "张韶涵a "
当字符串utf8长度为偶数,这时reuquest没有自做主张截取,显示正确。 "张韶涵a "=3x3字节汉字+1x1字节ascii=10字节utf。

3、解决办法?
get方法由querystring处理,没法解决,只能根据utf长度凭狗屎运气。
如果是post方法过来的,可以用binaryread全部读取转换,这时编码不会有错,但是必须自己处理application/x-www-form-urlencoded的原始数据。

总之:不要在服务器和客户端用2种编码。