ASP Classic中的UTF-8 Server.UrlEncode问题

时间:2009-03-05 13:40:07

标签: php vbscript asp-classic

我有点麻烦的URL编码一串UTF-8编码的文本来传递HTTP。我在经典ASP(vbscript)中使用Server.URlEncode对“é”字符进行编码。

它生成以下字符串

%C3%83%C2%A9

我通过HTTP与之交谈的系统是PHP,但它无法解码此字符串。在http://www.albionresearch.com/misc/urlencode.php使用PHP编码器,使用PHP URL编码方法编码的相同字符为

%E9

有谁知道如何在ASP中成功编码我的UTF-8编码字符串,以便PHP系统能够成功解码它们?

6 个答案:

答案 0 :(得分:4)

  

%C3%83%C2%A9

编码过多:字符串写为UTF-8,以ISO-8859-1读回,然后在进行十六进制编码之前再次写为UTF-8!

  

%E9

编码太少:字符串写成普通的ISO-8859-1和十六进制编码。如果您正在与之交谈的PHP脚本期望ISO-8859-1,那么这很好,但现代Web系统应该使用UTF-8,在这种情况下,您希望它看起来像这样的序列:

  

%C3%A9

(编码恰到好处!)

  

我在经典ASP中使用Server.URLEncode

遗憾的是,经典ASP在处理Unicode方面存在一些严重的缺陷。您可以设置@ CODEPAGE = 65001(和Response.Charset =“UTF-8”)来生成UTF-8页面,但您的内部字符串类型仍然在系统代码页中编码,从表单提交或数据库中获取的任何数据都将被读入该编码。

所以你可以URLEncode()一个文字chr 233来获得正确的输出OK,但如果你在表单提交中从UTF-8编码的'é'获取数据,你最终会得到' é' - UTF-8序列被误解为ISO-8859-1(实际上是cp1252,相当于Windows)。

答案 1 :(得分:2)

这个怎么样?

Function URLEncodeWithCodepage(value, myCodepage)
    Dim cpOriginal
    cpOriginal = Response.Codepage
    Response.Codepage = myCodepage
    URLEncodeWithCodepage = Server.URLEncode(value)
    Response.Codepage = cpOriginal
End Function

您可以将其与

一起使用
encodedValue = URLEncodeWithCodepage(value, 65001) 

获取UTF-8编码

答案 2 :(得分:1)

将以下内容添加到返回数据的ASP页面的头部

Response.ContentType = "text/html"
Response.AddHeader "Content-Type", "text/html;charset=UTF-8"
Response.CodePage = 65001
Response.CharSet = "UTF-8"

答案 3 :(得分:0)

这是我的工作。

创建一个用JScript编码的新ASP文件(不在VBScript中)调用urlEncodeUTF8.asp:

<%@ Language="JScript" %>
<%
    Response.CharSet="UTF-8"
    Response.Write(encodeURIComponent(Request("s")))
%>

在主ASP文件中编写以下代码:

FUNCTION URLEncodeUTF8(ByVal str)
    URLEncodeUTF8 = ""
    On Error Resume NEXT
    Err.Clear
    postStr = "s=" & Server.URLEncode(str)
    sURL = "http://" & Request.ServerVariables("SERVER_NAME") & "/urlEncodeUTF8.asp"
    SET xmlHTTPObj = CreateObject("MSXML2.ServerXMLHTTP")
    WITH xmlHTTPObj
        .SetTimeouts 2000, 2000, 2000, 5000
        .Open "POST", sURL, false
        .SetRequestHeader "Content-Type", "application/x-www-form-urlencoded; charset=utf-8"
        .SetRequestHeader "Content-Length", Len(postStr)
        .Send postStr
        xmlHttpResponse = .responseText
        IF Err.number=0 AND .Status=200 THEN
            URLEncodeUTF8 = xmlHttpResponse
        END IF
    END WITH    
    SET xmlHTTPObj = NOTHING
    On Error Goto 0
END FUNCTION

现在你可以使用上面的函数URLEncode你的字符串:

Response.Write(URLEncodeUTF8("é"))

在这种情况下,结果将是:

%C3%A9

答案 4 :(得分:0)

bobinceanswer很好地解释了内置函数为何不起作用以及为什么更改CodePage或{{1 }}不足以改变它。

但是您不必使用额外的JavaScript页面即可使用自定义功能。下面的VBScript函数将转义UTF8字符,包括使用多个字节的字符,例如Response,例如Session

%C3%A9

答案 5 :(得分:0)

David Cain和Santiago的URLEncodeWithCodepage(值65001)与Server.URLEncode(值)相同。

我发现的最好方法是JavaScript runat服务器!

<script language="javascript1.2" runat="server">
function twEntitesHTMLEncode(sChaineTemp) {
    var buffer = "";
    for (var i=0;i<=sChaineTemp.length-1;i++) {
        buffer = buffer + "&#" + sChaineTemp.charCodeAt(i);
    }
   return buffer;
}
</script> 

<%=twEntitesHTMLEncode("école")%>