2009-08-16 10 views
1

J'ai une base de données MySQL qui doit être accessible à la fois par PHP et MySQL, cela fonctionne bien dans la plupart des cas, mais certains caractères "spéciaux", par exemple. les guillemets doubles, les apostrophes ne s'affichent pas correctement dans les scripts ASP. Par exemple, la base de données MySQL provient d'une installation Drupal et contient une table avec un champ contenant le texte "A double quote" (les guillemets sont des guillemets intelligents mais ne semblent pas apparaître au débordement de la pile). Cela s'affiche correctement dans un script PHP, mais pas un script ASP. J'ai écrit un script simple à la fois PHP et ASP en boucle à travers la chaîne et imprimer les codes de caractères ici sont les sorties:Caractères Unicode dans MySQL retournant différentes valeurs de code de caractères en PHP et ASP

PHP

“ 147 
A 65 
32 
d 100 
o 111 
u 117 
b 98 
l 108 
e 101 
32 
q 113 
u 117 
o 111 
t 116 
e 101 
” 148 

ASP

� 8220 
A 65 
32 
d 100 
o 111 
u 117 
b 98 
l 108 
e 101 
32 
q 113 
u 117 
o 111 
t 116 
e 101 
� 8221 

Comme vous pouvez voyez, les guillemets doubles sortent comme des caractères différents dans PHP et ASP, et ceux d'ASP ne sont pas rendus correctement. Je cours MySQL 5 sur une machine Windows en utilisant une installation Drupal standard avec PHP 5. ASP utilise le pilote MySQL ODBC 3.51 et je ne suis pas en cours d'exécution d'autres commandes en PHP ou ASP, sauf pour ouvrir une connexion et Exécutez l'instruction select.

Modifier Comme demandé ici est le script asp

Dim strConn, objConn, objRS, strQ 
Dim i, strBody 

strConn = "DRIVER={MySQL ODBC 3.51 Driver}; SERVER=" & strDBServer & "; DATABASE=studential; UID=" & strDBUser & ";PASSWORD=" & strDBPass & "; OPTION=3" 

Set objConn = Server.CreateObject("ADODB.Connection")  
objConn.Open(strConn) 

strQ = "select body from drupal_node_revisions where nid = 261" 
Set objRS = objConn.Execute(strQ) 

strBody = objRS("body") 

For i = 1 To len(strBody)  
    Response.write(Mid(strBody, i, 1) & " " & AscW(Mid(strBody, i, 1)) & "<br />") 
Next 

objRS.Close 
objConn.Close 

Set objRS = Nothing 
Set objConn = Nothing 

modifier plus

Lors du remplacement du AscW avec Asc dans la ligne ci-dessous:

Response.write(Mid(strBody, i, 1) & " " & AscW(Mid(strBody, i, 1)) & "<br />") 

Les codes de caractères correspondent maintenant, mais les caractères de citation affichent encore incorrctly. Ma page contient le tag charset utf-8, donc il se peut que ce soit quelque chose avant qui n'utilise pas l'encodage utf-8 - des idées de ce que c'est ou comment je peux le réparer?

Merci pour votre aide,

Tom

Répondre

0

Votre script ASP semble utiliser Unicode - 8220 = 0x201C qui est l'Unicode "GAUCHE DOUBLE GUILLEMET". Vous voyez probablement de la foutaise sur l'écran parce que votre script ASP ne sort pas un encodage valide de cette chaîne unicode, mais nous devrions voir le code pour déterminer exactement pourquoi.

+0

J'ai ajouté le script ASP à la question originale - merci, Tom – Loftx

+0

AscW() vous donnerait le caractère unicode, je devine qu'il convertit l'entrée char 147 et traduit en unicode. Que se passe-t-il si vous utilisez Asc()? C'est difficile à dire, mais je vais deviner que votre script ASP dit au navigateur d'obtenir UTF-8, et vous passez Latin1. –

+0

Salut Paul, tu as raison quand je le remplace par Asc les codes apparaissent les mêmes. Des idées que je pourrais avoir besoin de changer dans mon script pour passer utf-8 au lieu de latin1? – Loftx

2

Il semble y avoir plusieurs choses qui se passent ici:

Je vais supposer que dans la base de données, le corps de la colonne dans la table drupal_node_revisions est en effet réglé sur un jeu de caractères Unicode. De plus, je suppose qu'il commence en effet par le point de code U + 201C MARK DOUBLE QUOTATION MARK.

Maintenant, le PHP semble se connecter à la base de données dans Latin1. Cela fait que MySQL convertit les données en cours de lecture sur Windows-1252 ("Latin1" dans MySQL signifie vraiment Windows-1252). D'où la conversion du premier caractère en un seul octet 147. Ensuite, lorsque vous produisez cela à partir de PHP, je suppose que vous n'indiquez pas le codage de caractères de la page Web, ce qui le rend par défaut à Latin1, qui (soupir) presque tous les navigateurs traitent comme Windows-1252.Par conséquent, les guillemets doubles affichent correctement, mais en fait deux erreurs ont été faites, ce qui entraînera d'autres caractères Unicode ne:

  1. Vous devez exécuter SET NAMES utf8; dans la connexion assurer que toutes les variables de connexion à MySQL (il y a trois!) travaillent en UTF-8.

  2. Vous devez vous assurer que le type de contenu de la page Web indique un jeu de caractères UTF-8. Cela peut être fait avec un élément meta: <meta http-equiv="content-type" content="text/html;charset=utf-8">

Le code ASP semble se connecter à la base de données dans un codage Unicode. Ceci est indiidé car l'expression AscW(Mid(strBody, i, 1)) renvoie 8220 pour le premier caractère. Le problème dans la sortie, générant les glyphes de caractères inconnus est à nouveau que le jeu de caractères de la page HTML a probablement été laissé à défaut, et non à un encodage compatible Unicode. Je ne connais pas suffisamment ASP pour savoir comment la méthode Response.write() détermine quel encodage de jeu de caractères utiliser, ou si elle s'attend à ce que la chaîne soit déjà encodée, donc je ne peux pas m'empêcher de trouver comment faire en sorte que ce chemin de données est Unicode propre bout à bout.

Questions connexes