我有点麻烦的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系统能够成功解码它们?
答案 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)
bobince的answer很好地解释了内置函数为何不起作用以及为什么更改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")%>