ASP Classic集成Mandrill时特殊字符转码异常问题求助
这个乱码问题很典型——Göran变成Göran是因为UTF-8编码的字符被当成了单字节编码(比如ISO-8859-1)解析。既然jQuery Ajax发送正常,说明Mandrill本身支持UTF-8,问题出在ASP这边的请求编码处理上,我给你几个关键的修复步骤:
1. 强制ASP页面使用UTF-8编码
首先要确保你的ASP页面本身用UTF-8处理字符串和输出,在页面最顶部加上:
<%@ Language=VBScript CodePage=65001 %> <% Response.CodePage = 65001 Response.CharSet = "UTF-8" %>
CodePage=65001是UTF-8的代码页,这会让ASP在处理请求参数、字符串拼接时都用UTF-8,而不是默认的系统编码。之前改Session.CodePage没用,是因为它只影响Session变量,不影响页面本身的编码处理。
2. 发送Mandrill请求时明确指定UTF-8编码
如果是用MSXML2.XMLHTTP发送请求,仅仅传字符串可能会被系统默认编码转码,导致Mandrill收到的不是UTF-8数据。你需要用ADODB.Stream把字符串转换成UTF-8二进制再发送,同时设置正确的请求头:
Dim xmlHttp, stream, jsonData, postData Set xmlHttp = Server.CreateObject("MSXML2.XMLHTTP.6.0") Set stream = Server.CreateObject("ADODB.Stream") ' 构造包含特殊字符的JSON数据 jsonData = "{""message"": {""to"": [{""email"": ""recipient@example.com"", ""name"": ""Göran""}], ""subject"": ""Test Email"", ""text"": ""Hello Göran!""}, ""key"": ""你的Mandrill API密钥""}" ' 将JSON字符串转换为UTF-8二进制流 stream.Type = 2 ' adTypeText stream.Charset = "UTF-8" stream.Open stream.WriteText jsonData stream.Position = 0 stream.Type = 1 ' adTypeBinary postData = stream.Read stream.Close ' 发送请求 xmlHttp.Open "POST", "https://mandrillapp.com/api/1.0/messages/send.json", False xmlHttp.setRequestHeader "Content-Type", "application/json; charset=utf-8" xmlHttp.Send postData ' 处理响应(可选) If xmlHttp.Status = 200 Then Response.Write "发送成功:" & xmlHttp.ResponseText Else Response.Write "错误:" & xmlHttp.Status & " " & xmlHttp.StatusText End If Set stream = Nothing Set xmlHttp = Nothing
这里的关键是:
- 设置
Content-Type头明确告诉Mandrill请求体是UTF-8编码的JSON - 用
ADODB.Stream避免ASP自动转码,确保发送的是纯UTF-8字节
3. 确保表单提交的编码正确(如果是表单传参的话)
如果你的Göran是从前端表单提交过来的,要给表单加上accept-charset="UTF-8"属性,并且用POST方法提交:
<form method="post" accept-charset="UTF-8"> <input type="text" name="username" value="Göran"> <button type="submit">发送邮件</button> </form>
这样ASP就能正确解析UTF-8编码的表单数据,不会把ö转成乱码。
4. 强制Mandrill邮件内容用UTF-8
最后,在构造Mandrill的消息时,可以明确指定邮件内容的编码,避免Mandrill自动猜测出错:
在JSON的message节点里加上headers字段:
"headers": { "Content-Type": "text/plain; charset=utf-8" }
如果是HTML邮件,就改成text/html; charset=utf-8。
按照这几步来,应该就能解决乱码问题了——本质就是让ASP的整个处理流程(接收参数、构造数据、发送请求)都用UTF-8,和jQuery Ajax的行为保持一致。
内容的提问来源于stack exchange,提问作者DarknessZX

