首頁 > 後端開發 > php教程 > 為什麼 PDO_ODBC 無法從 Access 擷取 UTF-8 重音字元?

為什麼 PDO_ODBC 無法從 Access 擷取 UTF-8 重音字元?

Barbara Streisand
發布: 2024-10-20 17:52:02
原創
882 人瀏覽過

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

PDO_ODBC檢索Access UTF-8重音字元失敗

問題描述

問題描述Incorrect string value: '\xE9d'

直接輸出帶有「無效」字元的行文字時,瀏覽器會顯示一個黑色方塊中的問號(因此 é 會變成這個無效符號)。

注意:同一表單可以很好地接受、保存和顯示文字方塊中的“é”,用於該資料庫上傳的標題。此外,如果「另存為」該頁面並重新打開,則「é」可以正確顯示。

以下是連接方式:
$conn = new PDO("odbc:Driver={Microsoft Access Driver (*.mdb)};Dbq=$fileLocation;SystemDB=$securefilePath;Uid=developer;Pwd=pass;charset=utf;");
登入後複製

嘗試過多種方法,包括:
$conn -> exec("set names utf8");
登入後複製

在Access中嘗試「CurrentDb.Collat​​ingOrder」時,會顯示1033,顯然這是“英語、德語、法語和葡萄牙語排序規則”的dbSortGeneral。

出了什麼問題?感覺就像PDO正在向我發送我的瀏覽器和PHP不完全理解的校對。

問題解決

1. 簡單但不完整的修復

實際上,Access ODBC返回的文字與Windows -1252字元編碼中該字元匹配,即使它儲存在Access資料庫中作為Unicode字元。因此,對於範例表“Teams”,
Team
-----------------------
Boston Bruins
Canadiens de Montréal
Федерация хоккея России
登入後複製

程式碼
<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>
登入後複製

會在瀏覽器中顯示
Boston Bruins
Canadiens de Montr�al
????????? ?????? ??????
登入後複製

2. 完整的修復

要獲得完全的UTF-8支持,我們需要使用帶有ADODB連接和記錄集對象的COM,如下所示:
<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>
登入後複製

以上是為什麼 PDO_ODBC 無法從 Access 擷取 UTF-8 重音字元?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板