在经典ASP中将UTF-8转换为ISO-8859-1

4

我的网站现在完全使用UTF-8编码,但是为了使用serverXMLHTTP发送短信,我需要在发送之前将消息从UTF-8转换为ISO-8859-1。

这种情况类似于:

a.asp:

<html><head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head><body>
<form method="post" action="b.asp">
<input type text name="message" value="æøå and ÆØÅ"><br>
<input type=submit>
</body>

然后是b.asp

<html><head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
</head><body>
<%=konvert(request("message"))%><br>
</body>
<%
Function Konvert(sIn)
    Dim oIn : Set oIn = CreateObject("ADODB.Stream")
    oIn.Open
    oIn.CharSet = "UTF-8" 
    oIn.WriteText sIn
    oIn.Position = 0
    oIn.CharSet = "ISO-8859-1"
    Konvert = oIn.ReadText
    oIn.Close
End Function
%>

在这个展示中,我希望在 b.asp 中看到与我在 a.asp 中发送的相同字符串,但实际上我得到了这个:
æøå and ÆØÅ

有什么想法吗?
1个回答

7
你正在处理客户端编码,但没有处理服务器端编码。
实际上,ASP如何处理服务器请求取决于你的服务器配置。
处理IIS编码响应有两个部分:
1. 物理文件(b.asp)的编码方式(UTF-8、Windows-1252、西欧(ISO)等)。只要处理CodePage与ASP文件匹配,这不应该成为问题(个人更喜欢使用UTF-8,在新版本的IIS中,这是默认设置)。 2. ASP页面希望以什么CodePage进行处理?(<% @ CodePage %>属性)
你可以在测试页面中使用下面的代码片段来确定服务器的默认设置。
<%
'Check how the server is currently encoding responses.

Call Response.Write(Response.Charset)
Call Response.Write(Response.CodePage)
%>

为了使下面的示例正常工作,必须将 b.asp 保存为 65001 (UTF-8)。如果您使用的是 Visual Studio,则可以使用“高级保存选项”对话框进行设置(默认情况下不显示在菜单中,必须使用自定义菜单选项添加)。
<%@Language="VBScript" CodePage = 65001 %>
<% 
'IIS should process this page as 65001 (UTF-8), responses should be 
'treated as 28591 (ISO-8859-1).

Response.CharSet = "ISO-8859-1"
Response.CodePage = 28591
%>

你可能是对的,但在我的实际问题中,b.asp代表短信提供商,我对他的部分一无所知。只知道他必须接收以ISO-8859-1编码的消息。同时,我已经想出了一个小片段(见下文),可能可以解决我的问题。 - PC-Gram
我假设b.asp是您的消息和短信发送机制之间的中间人。您仍然可以使用这种方法,让服务器为您转换UTF-8编码为ISO-8859-1,然后使用ServerXmlHttp将其发送到您的短信提供商。 - user692942
案件已结:我在发送数据之前立即添加了两行代码...charset="ISO-8859.1"和...codepage=28591,然后立即恢复为"UTF-8"和65001,以便我的基于UTF-8的页面正确呈现一些特殊字符。 - PC-Gram
ASP似乎可以在声明中不指定65001而解析它。 - Ian Warburton
@IanWarburton 是的,它可以做到,但这意味着您会做出很多假设。我正试图帮助人们理解这个问题。 - user692942

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