读书人

asp转码有关问题

发布时间: 2012-03-18 13:55:39 作者: rapoo

asp转码问题
这个问题困扰我很久了,希望csdn的高手能够帮助解决。
我需要用URL来传值,这个值是UTF-8编码的,比如“%E6%88%91%E7%88%B1%E4%BD%A0”,汉字就是“我爱你”。
理论上来讲我们用Request接收到这个值之后,将它转换成gb2312就行了。可是问题就在这里了,我用Request接收%E6%88%91%E7%88%B1%E4%BD%A0这个值的时候结果就成了“浣”,而我用一个utf-8转gb的代码转“%E6%88%91%E7%88%B1%E4%BD%A0”这个值,可以正常转换。但是如果转换接收到的这个“浣”就无法转换,也是乱码。

问题说清楚了,我想常用asp的人应该知道这个问题。简单的讲就是我需要接受URL中一个UTF-8的值,接受之后转为gb2312。
(对了,不可以在传值之前先转码)

[解决办法]
假设你得主机编码为gbk,那么不管什么数据收来都会按gbk解码,所以如果出现乱码的话,首先要还原成原来的数据,然后再用正常的解码方式处理

'还原为原数据
set objAds=createobject("adodb.stream")
objAds.Type=2
objAds.mode=3
objAds.charset="gbk" '<---你主机的编码
objAds.open
objAds.writeText "浣" '<---乱码,或者直接objAds.writeText request("xxx")
'这时objAds为没有编码过的原二进制数据了,采用正确解码
objAds.postion=0
objAds.charset="utf-8"
objAds.Positon=0
response.write objAds.readText() '<结果


ps:lz换个头像把,男人看男人怎么看都恶心
[解决办法]

VBScript code
<%Class StringList    Private dict, strName, i    Private Sub Class_Initialize()        Set dict = CreateObject("Scripting.Dictionary")        i = 0    End Sub        Public Property Get Count()        Count = i    End Property        Public Property Let Name(newValue)        strName = newValue    End Property        Public Property Get Name()        Name = strName    End Property        Public Sub Add(strValue)        i = i + 1        dict.Add i, strValue    End Sub        Public Default Property Get ToString()        ToString = Me.Item(Empty)    End Property        Public Property Get Item(index)        If Not IsEmpty(index) And IsNumeric(index) Then            If index<1 Then Err.Raise -1, "StringList.Item", "下标越界"            If index>i Then Err.Raise -1, "StringList.Item", "下标越界"            Item = dict.Item(index)        ElseIf i>0 Then            Item = Join(dict.Items(), ", ")        End If    End PropertyEnd ClassFunction decodeURIComponent(str, cSet)    With Server.CreateObject("ADODB.Stream")        .Type = 2        .Charset = "iso-8859-1"        .Open        .WriteText UnEscape(Replace(str, "+", "%20"))        .Position = 0        .Charset = cSet        decodeURIComponent = .ReadText(-1)        .Close    End WithEnd FunctionFunction getParameter(name, cSet, dictionary)    Dim match : Set getParameter = New StringList : getParameter.Name = name    With New RegExp        .Pattern = "(?:^|&)" & Server.URLEncode(name) & "=([^&]*)"        .Global = True        For Each match In .Execute(dictionary)            getParameter.Add decodeURIComponent(match.Submatches.Item(0), cSet)        Next    End withEnd Function%><%=getParameter("p", "UTF-8", Request.QueryString)%><br /><%=getParameter("p", "UTF-8", Request.QueryString).Count%><br /><%=getParameter("p", "UTF-8", Request.QueryString).Item(1)%><br /><!--Dim pSet p = getParameter("p", "UTF-8", Request.QueryString)p.Countp.Item(1)p.Count 和 p.Item(index)  是在当出现同名参数时 使用.如果不考虑同名参数,则代码可以进行大幅删减--> 

读书人网 >ASP

热点推荐