sql >> Database teknologi >  >> RDS >> Mysql

Klassisk ASP, MySQL eller ODBC UTF8-kodning

Du har en chance for slovenske bogstaver ifølge denne kortlægning og et uddrag fra Windows-1252 wiki-artikel :

Her er de ting, du skal gøre:

  1. Brug UTF-8 (uden stykliste) kodede filer mod muligheden for at indeholde hårdkodet tekst. (✔ allerede udført)

  2. Angiv UTF-8 for svartegnsæt med ASP på serversiden eller med metatags på klientsiden. (✔ allerede udført)

  3. Fortæl MySQL-serveren, at dine kommandoer er i tegnsæt utf-8, og du forventer utf-8-kodede resultatsæt. Tilføj en indledende sætning til forbindelsesstrengen:...;stmt=SET NAMES 'utf8';...

  4. Indstil Response.CodePage til 1252.

Jeg har testet følgende script, og det virker som en charme.

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 sidste bemærkning:

Når du skal anvende html-kodning til strenge hentet fra databasen, bør du ikke bruge Server.HTMLEncode længere, da Response.Codepage er 1252 på server-siden, og da Server.HTMLEncode er afhængig kontekst-kodetabel, vil dette forårsage volapyk-output.
Så du bliver nødt til at skrive din egen html-koder for at håndtere sagen.

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. Hvad skal jeg undslippe, når jeg sender en forespørgsel?

  2. Henvisning til en række fra en anden tabel (PostgreSQL)

  3. Returner en liste over partitionsskemaer i SQL Server (T-SQL)

  4. Forespørgsel for at vælge strenge, der slutter med et bestemt tegn