Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Klassische ASP-, MySQL- oder ODBC-UTF8-Codierung

Gemäß dieser Zuordnung und ein Auszug aus Windows-1252-Wiki-Artikel :

Folgendes ist zu tun:

  1. Verwenden Sie UTF-8-codierte (ohne BOM) Dateien, um die Möglichkeit zu vermeiden, dass sie fest codierten Text enthalten. (✔ bereits erledigt)

  2. Geben Sie UTF-8 für den Antwortzeichensatz mit ASP auf der Serverseite oder mit Meta-Tags auf der Clientseite an. (✔ bereits erledigt)

  3. Teilen Sie dem MySQL-Server mit, dass Ihre Befehle im Zeichensatz utf-8 sind und Sie utf-8-codierte Ergebnismengen erwarten. Fügen Sie der Verbindungszeichenfolge eine erste Anweisung hinzu:...;stmt=SET NAMES 'utf8';...

  4. Setzen Sie Response.CodePage auf 1252.

Ich habe das folgende Skript getestet und es funktioniert wie am Schnürchen.

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>

Als letzte Bemerkung:

Wenn Sie HTML-Codierung auf aus der Datenbank abgerufene Zeichenfolgen anwenden müssen, sollten Sie Server.HTMLEncode nicht mehr verwenden, da Response.Codepage serverseitig 1252 ist und da Server.HTMLEncode eine kontextabhängige Codepage ist, führt dies zu Kauderwelschausgaben.
Sie müssen also Ihren eigenen HTML-Encoder schreiben, um diesen Fall zu handhaben.

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)