Mengapakah PDO_ODBC gagal mendapatkan semula aksara beraksen UTF-8 daripada Access?

Barbara Streisand
Lepaskan: 2024-10-20 17:52:02
asal
789 orang telah melayarinya

Why does PDO_ODBC fail to retrieve UTF-8 accented characters from Access?

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'
Salin selepas log masuk

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;");
Salin selepas log masuk

Telah mencuba pelbagai kaedah termasuk:

$conn -> exec("set names utf8");
Salin selepas log masuk

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
Федерация хоккея России
Salin selepas log masuk

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>
Salin selepas log masuk

akan dipaparkan dalam penyemak imbas

Boston Bruins
Canadiens de Montr�al
????????? ?????? ??????
Salin selepas log masuk

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>
Salin selepas log masuk

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!

sumber:php
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!