PDO_ODBC gagal mendapatkan akses aksara beraksen UTF-8
Penerangan Masalah
Cuba gunakan Access Menukar pangkalan data kepada MySQL, semuanya berfungsi dengan baik, tetapi saya menghadapi masalah besar: jika pangkalan data Access mengandungi sebarang aksara bukan standard, penukaran gagal. Pertanyaan mengembalikan ralat berikut:
Incorrect string value: '\xE9d'
Apabila mengeluarkan terus baris teks dengan aksara "tidak sah", penyemak imbas memaparkan tanda soal dalam segi empat sama hitam (jadi é menjadi simbol tidak sah ini).
Nota: Borang yang sama berfungsi dengan baik untuk menerima, menyimpan dan memaparkan "é" dalam kotak teks untuk tajuk muat naik pangkalan data ini. Selain itu, jika saya "simpan sebagai" halaman dan membukanya semula, "é" dipaparkan dengan betul.
Begini cara untuk menyambung:
$conn = new PDO("odbc:Driver={Microsoft Access Driver (*.mdb)};Dbq=$fileLocation;SystemDB=$securefilePath;Uid=developer;Pwd=pass;charset=utf;");
Telah mencuba pelbagai kaedah termasuk:
$conn -> exec("set names utf8");
Apabila mencuba "CurrentDb.CollatingOrder" dalam Access, ia mendapat Ia menunjukkan 1033 , nampaknya ini adalah dbSortGeneral untuk "peraturan pengisihan bahasa Inggeris, Jerman, Perancis dan Portugis".
Apa yang berlaku? Rasanya PDO menghantar saya pruf yang pelayar dan PHP saya tidak faham sepenuhnya.
Masalah Selesai
1 Pembetulan ringkas tetapi tidak lengkap
Malah, teks yang dikembalikan oleh Access ODBC berbeza daripada. Windows Watak ini sepadan dengan pengekodan aksara -1252, walaupun ia disimpan dalam pangkalan data Access sebagai aksara Unikod. Jadi untuk jadual contoh "Pasukan",
Team ----------------------- Boston Bruins Canadiens de Montréal Федерация хоккея России
kod
<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>
akan dipaparkan dalam penyemak imbas
Boston Bruins Canadiens de Montr�al ????????? ?????? ??????
Lengkap Betulkan
Untuk mendapatkan sokongan penuh UTF-8 kita perlu menggunakan COM dengan sambungan ADODB dan objek set rekod seperti ini:
<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>
Atas ialah kandungan terperinci Mengapakah PDO_ODBC gagal mendapatkan semula aksara beraksen UTF-8 daripada Access?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!