【问题标题】:Classic ASP, MySQL or ODBC UTF8 encoding经典 ASP、MySQL 或 ODBC UTF8 编码
【发布时间】:2013-08-16 08:30:42
【问题描述】:

我有一个使用 GoDaddy 托管的网站,包括后端的 MySQL 数据库。该站点是斯洛文尼亚站点,因此使用了特殊字符。

该网站是用经典的 ASP 构建的,我在 Notepad++ 中创建了所有使用 utf-8 编码的页面。在每一页的顶部,我还有 Session.CodePage=65001、Session.LCID=1060 和 Response.Charset="utf-8"。 MySQL db 和所有的表也是 utf8 编码的。

如果我通过Workbench界面直接查看db中的数据,一切正常,包括我使用的一些特殊的斯洛文尼亚字符,比如:č

如果我访问我的网站,斯洛文尼亚语字符也打印得很好,包括 č

唯一的问题是,在同一页面上,从 MySQL 检索的数据编码不正确,所以字母 č 变成了?

可能是什么问题以及如何解决?

首先我以为是 MySQL ODBC 3.51 驱动程序,我用它来连接数据库。我尝试将 charset=utf8 添加到连接字符串,但没有奏效。我还尝试将 charset=ucs2 添加到连接字符串中,这是我在另一个网站上找到的提示,但它也没有帮助。 GoDaddy 不支持 MySQL ODBC 5.1 驱动程序,这可能是一个解决方案。

我的选项不多了,请帮忙。

【问题讨论】:

  • 您的页面是否以 UTF-8 格式保存,或者您只是使用元标记来设置字符集。换句话说,当您在记事本中打开一个页面并从“文件”菜单中选择“另存为”时。 Endcoding 下拉设置是什么?如果是“ANSI”,则将其更改为“UTF-8”
  • 是的,页面以 UTF8 保存。我使用记事本++。
  • 我认为您对驱动程序的看法可能是正确的。我正在开发的一个网站正在逐渐从 Classic 转换为 .net。不久前,我用谷歌将“关于我们”页面翻译成俄语并将其粘贴到数据库中,看看它是否能处理西里尔字母。如果我使用 .net,它工作得很好,但我只是用 Classic 提取相同的记录,我得到你得到的。它使用经典的 3.51 驱动程序。两个页面的链接都在这里clubdanceholidays.co.uk/AboutUs.aspx?language=Russianclubdanceholidays.co.uk/aboutusru.asp
  • 切换到 5.1 驱动程序确实解决了我的问题。也许您需要寻找另一个 Web 主机。谢谢你的问题 - 我学到了一些东西

标签: mysql utf-8 asp-classic character-encoding odbc


【解决方案1】:

根据mappingWindows-1252 wiki article 的摘录,您有机会获得斯洛文尼亚语字母:

根据 Microsoft 和 Unicode Consortium 网站上的信息, 位置 81、8D、8F、90 和 9D 未使用;但是,Windows API MultiByteToWideChar 将这些映射到相应的 C1 control codes

位置 80 的欧元字符在此代码页的早期版本中不存在, S、s、Z 和 z 也没有带 caron (háček)。

以下是要做的事情:

  1. 使用 UTF-8(无 BOM)编码的文件以防止包含硬编码文本的可能性。 (✔已经完成)

  2. 在服务器端使用 ASP 或在客户端使用元标记为响应字符集指定 UTF-8。 (✔已经完成)

  3. 告诉 MySQL 服务器您的命令是 utf-8 字符集,并且您期望 utf-8 编码的结果集。在连接字符串中添加初始语句:...;stmt=SET NAMES 'utf8';...

  4. 将 Response.CodePage 设置为 1252。

我已经测试了以下脚本,它就像一个魅力。

DDL: http://sqlfiddle.com/#!8/c2c35/1

平均售价:

<%@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, "&", "&amp;")
    str = Replace(str, "<", "&lt;")
    str = Replace(str, ">", "&gt;")
    str = Replace(str, """", "&quot;")
    MyOwnHTMLEncode = str
End Function
'Response.Write MyOwnHTMLEncode(rs("myfield").value)

【讨论】:

  • 我已经实施了您的建议,但现在我遇到了硬编码斯洛文尼亚字母的问题。来自 MySQL 的数据现在可以了,但硬编码文本无法正确显示:slotenis.si/test.asp
  • @gdolenc ASP 的响应流对 BOM 敏感。尝试保存您的文件ANSI as UTF-8 EncodedUTF-8 without BOM。英文记事本++到Encode &gt; Convert to UTF-8 without BOM
  • 其实硬编码的数据是正确的,只要真的是硬编码的,那menas写成HTML。如果我使用 ASP/VBscript 命令 Response.Write ...,则不会打印斯洛文尼亚语字符。无论如何,现在这个问题已经解决了。但是还有另一个问题。如何使用 čšžČŠŽ 在 MySQL 中插入数据?我对 č 有疑问,它在 db 中变成 c,而 Č 变成 C。
  • @gdolenc 我没有任何编码问题,包括 INSERT 和 Response.Write's。一切对我来说都很好。这是另一个测试页面:aspfiddle.com/gdolenc2.asp 可以顺便下载源代码。可能错过了什么。
  • 完美。现在它起作用了。你是个天才。终于找到了一个真正了解编码问题以及如何解决它们的人。非常有帮助,感谢上帝,地球上仍然存在如此伟大的人。总结一下那些正在寻找解决方案的人: 1. 你所有的文件都必须是没有 BOM 的 UTF-8 编码!!! 2. 将 SET NAMES UTF8 添加到连接字符串,如下所示:connectstr = "Driver ... ";stmt=SET NAMES 'utf8';"。 3. 只是因为 FireFox,您必须在 Response.Charset = "utf-8"每个处理脚本的顶部,它将数据插入到数据库中。就是这样。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多