ASP经典版中UTF-8 Server.UrlEncode问题

3

我在 URL 编码 UTF-8 编码的文本字符串以通过 HTTP 传递时遇到了一些麻烦。 我正在使用经典 ASP(vbscript)中的 Server.URlEncode 在“é”字符上进行编码。

它会生成以下字符串,

%C3%83%C2%A9

然而,我要通过 HTTP 传输的系统是 PHP,它无法解码此字符串。 使用 PHP 编码器 http://www.albionresearch.com/misc/urlencode.php,使用 PHP URL 编码方法编码的相同字符会出现以下结果,

%E9

有没有人知道如何成功编码我的 UTF-8 编码字符串,以便 PHP 系统可以成功解码它们?

6个回答

6

%C3%83%C2%A9

这个编码过于复杂了:字符串被写成UTF-8格式,然后以ISO-8859-1格式读取,再次转换为UTF-8格式后进行十六进制编码!

%E9

这个编码不够复杂:字符串被以普通的ISO-8859-1格式写出并进行十六进制编码。如果你要和一个期望ISO-8859-1格式的PHP脚本通信,那么这样做是没问题的,但是现代的Web系统应该使用UTF-8格式交流,此时你需要让它看起来像这样:

%C3%A9

(这个编码刚刚好!)

我正在使用经典ASP中的Server.URLEncode

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

因此,你可以对字符chr 233进行URLEncode()以获得正确的输出,但是如果你从表单提交中获取UTF-8编码的‘é’,你最终会得到‘é’——将UTF-8序列误解为ISO-8859-1格式(实际上是cp1252,Windows的等效格式)。


3

这是什么?

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

您可以将其与IT技术相关内容一起使用。
encodedValue = URLEncodeWithCodepage(value, 65001) 

获取UTF-8编码


Session.CodePage 和 Response.CodePage 之间有什么区别吗? - cuixiping

1
请在返回数据的ASP页面头部添加以下内容。
Response.ContentType = "text/html"
Response.AddHeader "Content-Type", "text/html;charset=UTF-8"
Response.CodePage = 65001
Response.CharSet = "UTF-8"

0

这是我的解决方法。

创建一个使用JScript编写(而不是VBScript)的新ASP文件,并将其命名为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

现在你可以使用上述函数对字符串进行URL编码:
Response.Write(URLEncodeUTF8("é"))

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

%C3%A9

0

bobince答案很好地解释了为什么内置函数不起作用,以及为什么更改ResponseSessionCodePage并不足以改变它。

但是,您不必使用额外的JavaScript页面来使用工作的自定义函数。下面的VBScript函数将转义UTF8字符,包括那些使用多个字节的字符,例如在é的情况下使用%C3%A9

Function UrlEncode(url)
    For i = 1 To Len(url)
        n = Asc(Mid(url,i,1))
        If (n >= 48 And n <= 57) Or (n >= 65 And n <= 90) Or (n >= 97 And n <= 122) Then
            UrlEncode = UrlEncode & Mid(url,i,1)
        Else
            ChrHex = Hex(Asc(Mid(url,i,1)))
            For j = 0 to (Len(ChrHex) / 2) - 1
                UrlEncode = UrlEncode & "%" & Mid(ChrHex,(2*j)+1,2)
            Next
        End If
    Next
End Function

0

使用代码页65001的URLEncodeWithCodepage(value,65001)由David Cain和Santiago编写,与Server.URLEncode(value)相同。

我发现最好的方法是在服务器上运行JavaScript!

<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")%>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接