sql >> Databasteknik >  >> RDS >> Mysql

Klassisk ASP, MySQL eller ODBC UTF8-kodning

Du har en chans till slovenska bokstäver enligt denna mappning a> och ett utdrag från Windows-1252 wikiartikel :

Här är saker att göra:

  1. Använd UTF-8 (utan BOM)-kodade filer mot möjligheten att innehålla hårdkodad text. (✔ redan gjort)

  2. Ange UTF-8 för svarsteckenuppsättning med ASP på serversidan eller med metataggar på klientsidan. (✔ redan gjort)

  3. Berätta för MySQL-servern att dina kommandon finns i teckenuppsättning utf-8, och du förväntar dig utf-8-kodade resultatuppsättningar. Lägg till en initialsats till anslutningssträngen:...;stmt=SET NAMES 'utf8';...

  4. Ställ in Response.CodePage till 1252.

Jag har testat följande manus och det fungerar som en charm.

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>

Som en sista anmärkning:

När du behöver tillämpa html-kodning på strängar som hämtas från databasen, bör du inte använda Server.HTMLEncode längre eftersom Response.Codepage är 1252 på serversidan och eftersom Server.HTMLEncode är beroende av kontextkodtabellen kommer detta att orsaka sluddrig utdata.
Så du måste skriva din egen html-kodare för att hantera ärendet.

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)



  1. Hur man manuellt bygger mysql-cache

  2. Postgres:få min, max, sammanlagda värden i ett val

  3. Eager-Loading baserat på den första frågan

  4. Ställ in PDO för att skapa undantag som standard