Maison >développement back-end >tutoriel php >Pourquoi PDO_ODBC ne parvient-il pas à récupérer les caractères accentués UTF-8 depuis Access ?
PDO_ODBC n'a pas réussi à récupérer les caractères accentués Access UTF-8
Description du problème
Essayez de utiliser Access Conversion de la base de données en MySQL, tout fonctionne bien, mais je rencontre un problème majeur : si la base de données Access contient des caractères non standard, la conversion échoue. La requête renvoie l'erreur suivante :
Incorrect string value: '\xE9d'
Lors de la sortie directe d'une ligne de texte avec des caractères "invalides", le navigateur affiche un point d'interrogation dans un carré noir (le é devient donc ce symbole invalide).
Remarque : Le même formulaire fonctionne très bien pour accepter, enregistrer et afficher le "é" dans la zone de texte du titre de ce téléchargement de base de données. De plus, si je "enregistre sous" la page et que je la rouvre, le "é" s'affiche correctement.
Voici comment se connecter :
$conn = new PDO("odbc:Driver={Microsoft Access Driver (*.mdb)};Dbq=$fileLocation;SystemDB=$securefilePath;Uid=developer;Pwd=pass;charset=utf;");
J'ai essayé plusieurs méthodes, notamment :
$conn -> exec("set names utf8");
Lorsque vous essayez "CurrentDb.CollatingOrder" dans Access, il obtient Il affiche 1033 , apparemment, il s'agit de dbSortGeneral pour "règles de tri en anglais, allemand, français et portugais".
Qu'est-ce qui n'a pas fonctionné ? J'ai l'impression que PDO m'envoie une relecture que mon navigateur et PHP ne comprennent pas entièrement.
Problème résolu
1. Solution simple mais incomplète
En fait, le texte renvoyé par Access ODBC est différent de Windows Ce caractère correspond au codage de caractères -1252, même s'il est stocké dans la base de données Access en tant que caractère Unicode. Ainsi pour l'exemple de tableau "Équipes", le
Team ----------------------- Boston Bruins Canadiens de Montréal Федерация хоккея России
code
<code class="php">header('Content-Type: text/html; charset=utf-8'); ?> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Access character test</title> </head> <body> <?php $connStr = 'odbc:' . 'Driver={Microsoft Access Driver (*.mdb)};' . 'Dbq=C:\Users\Public\__SO\28311687.mdb;' . 'Uid=Admin;'; $db = new PDO($connStr); $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $sql = "SELECT Team FROM Teams"; foreach ($db->query($sql) as $row) { $s = $row["Team"]; echo $s . "<br/>\n"; } ?> </body> </html></code>
sera affiché dans le navigateur
Boston Bruins Canadiens de Montr�al ????????? ?????? ??????
Complet. Correctif
Pour obtenir une prise en charge complète de UTF-8, nous devons utiliser COM avec une connexion ADODB et un objet recordset comme celui-ci :
<code class="php">header('Content-Type: text/html; charset=utf-8'); ?> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Access character test</title> </head> <body> <?php $connStr = 'Driver={Microsoft Access Driver (*.mdb)};' . 'Dbq=C:\Users\Public\__SO\28311687.mdb'; $con = new COM("ADODB.Connection", NULL, CP_UTF8); // specify UTF-8 code page $con->Open($connStr); $rst = new COM("ADODB.Recordset"); $sql = "SELECT Team FROM Teams"; $rst->Open($sql, $con, 3, 3); // adOpenStatic, adLockOptimistic while (!$rst->EOF) { $s = $rst->Fields("Team"); echo $s . "<br/>\n"; $rst->MoveNext; } $rst->Close(); $con->Close(); ?> </body> </html></code>
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!