您有机会根据此获得斯洛文尼亚字母mapping以及摘录自Windows-1252 维基文章:
根据 Microsoft 和 Unicode Consortium 网站上的信息,
位置 81、8D、8F、90 和 9D 未使用;然而,Windows API多字节到宽字符将这些映射到相应的C1控制码.
位置 80 处的欧元字符在此代码页的早期版本中不存在,
S、s、Z 和 z 也没有带有卡隆 (háček)。
以下是要做的事情:
-
使用 UTF-8(无 BOM)编码文件可避免包含硬编码文本。 (✔ 已经完成)
-
在服务器端使用 ASP 或在客户端使用元标记为响应字符集指定 UTF-8。 (✔ 已经完成)
-
告诉 MySQL 服务器您的命令采用字符集 utf-8,并且您期望 utf-8 编码的结果集。将初始语句添加到连接字符串:...;stmt=SET NAMES 'utf8';...
-
将 Response.CodePage 设置为 1252。
我已经测试了以下脚本,它的效果非常好。
DDL: http://sqlfiddle.com/#!8/c2c35/1
ASP:
<%@Language=VBScript%>
<%
Option Explicit
Response.CodePage = 1252
Response.LCID = 1060
Response.Charset = "utf-8"
Const adCmdText = 1, adVarChar = 200, adParamInput = 1, adLockOptimistic = 3
Dim Connection
Set Connection = Server.CreateObject("Adodb.Connection")
Connection.Open "Driver={MySQL ODBC 3.51 Driver};Server=localhost;Database=myDb;User=myUsr;Password=myPwd;stmt=SET NAMES 'utf8';"
If Request.Form("name").Count = 1 And Len(Request.Form("name")) Then 'add new
Dim rsAdd
Set rsAdd = Server.CreateObject("Adodb.Recordset")
rsAdd.Open "names", Connection, ,adLockOptimistic
rsAdd.AddNew
rsAdd("name").Value = Left(Request.Form("name"), 255)
rsAdd.Update
rsAdd.Close
Set rsAdd = Nothing
End If
Dim Command
Set Command = Server.CreateObject("Adodb.Command")
Command.CommandType = adCmdText
Command.CommandText = "Select name From `names` Order By id Desc"
If Request.QueryString("name").Count = 1 And Len(Request.QueryString("name")) Then
Command.CommandText = "Select name From `names` Where name = ? Order By id Desc"
Command.Parameters.Append Command.CreateParameter(, adVarChar, adParamInput, 255, Left(Request.QueryString("name"), 255))
End If
Set Command.ActiveConnection = Connection
With Command.Execute
While Not .Eof
Response.Write "<a href=""?name=" & .Fields("name").Value & """>" & .Fields("name").Value & "</a><br />"
.MoveNext
Wend
.Close
End With
Set Command.ActiveConnection = Nothing
Set Command = Nothing
Connection.Close
%><hr />
<a href="?">SHOW ALL</a><hr />
<form method="post" action="<%=Request.ServerVariables("SCRIPT_NAME")%>">
Name : <input type="text" name="name" maxlength="255" /> <input type="submit" value="Add" />
</form>
最后一句话:
当您需要对从数据库获取的字符串应用 html 编码时,您不应再使用 Server.HTMLEncode,因为 Response.Codepage 在服务器端为 1252,并且 Server.HTMLEncode 是依赖于上下文的代码页,这将导致乱码输出。
因此,您需要编写自己的 html 编码器来处理这种情况。
Function MyOwnHTMLEncode(ByVal str)
str = Replace(str, "&", "&")
str = Replace(str, "<", "<")
str = Replace(str, ">", ">")
str = Replace(str, """", """)
MyOwnHTMLEncode = str
End Function
'Response.Write MyOwnHTMLEncode(rs("myfield").value)