При использовании собственных функций PHP ODBC (PDO_ODBC или более старых функций odbc_
) и драйвера ODBC Access текст не кодируется в кодировке UTF-8, хотя он хранится в Access как символы Unicode. Итак, для примерной таблицы с именем «Команды»
Team
-----------------------
Boston Bruins
Canadiens de Montréal
Федерация хоккея России
код
Access character test
setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$sql = "SELECT Team FROM Teams";
foreach ($db->query($sql) as $row) {
$s = $row["Team"];
echo $s . "
\n";
}
?>
отображает это в браузере
Boston Bruins
Canadiens de Montr�al
????????? ?????? ??????
Текст, возвращаемый Access, фактически соответствует кодировке символа Windows-1252 для символов в этом наборе символов, поэтому простое изменение строки
$s = $row["Team"];
до
$s = utf8_encode($row["Team"]);
позволит правильно отобразить вторую запись
Boston Bruins
Canadiens de Montréal
????????? ?????? ??????
, но функция utf8_encode () преобразуется из ISO-8859-1 , а не Windows-1252 , поэтому некоторые символы (особенно символ «евро») исчезнут. Лучшим решением было бы использовать
$s = mb_convert_encoding($row["Team"], "UTF-8", "Windows-1252");
, но это все равно не решило бы проблему с третьей записью в нашей примерной таблице.
Для полной поддержки UTF-8 нам нужно использовать COM с объектами ADODB Connection и Recordset, такими как
Access character test
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 . "
\n";
$rst->MoveNext;
}
$rst->Close();
$con->Close();
?>