Mysql
 sql >> Base de données >  >> RDS >> Mysql

Encodage ASP, MySQL ou ODBC UTF8 classique

Vous avez une chance d'obtenir des lettres slovènes selon ce mappage et un extrait de article wiki Windows-1252 :

Voici les choses à faire :

  1. Utilisez des fichiers encodés en UTF-8 (sans BOM) contre la possibilité de contenir du texte codé en dur. (✔ déjà fait)

  2. Spécifiez UTF-8 pour le jeu de caractères de réponse avec ASP côté serveur ou avec des balises méta côté client. (✔ déjà fait)

  3. Dites au serveur MySQL que vos commandes sont dans le jeu de caractères utf-8 et que vous attendez des jeux de résultats encodés en utf-8. Ajoutez une instruction initiale à la chaîne de connexion :...;stmt=SET NAMES 'utf8';...

  4. Définissez Response.CodePage sur 1252.

J'ai testé le script suivant et il fonctionne comme un charme.

LDD : 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>

Comme une dernière remarque :

Lorsque vous devez appliquer l'encodage html aux chaînes extraites de la base de données, vous ne devez plus utiliser Server.HTMLEncode car Response.Codepage est 1252 côté serveur et puisque Server.HTMLEncode est une page de codes contextuelle dépendante, cela entraînera des sorties charabia.
Vous devrez donc écrire votre propre encodeur html pour gérer le cas.

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)