You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP Classic集成Mandrill时特殊字符转码异常问题求助

解决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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 07:29:05