Выберите поле utf8 в Access с помощью php [duplicate]

2
задан Gord Thompson 5 February 2015 в 11:48
поделиться

1 ответ

Проблема

При использовании собственных функций PHP ODBC (PDO_ODBC или более старых функций odbc_) и драйвера ODBC Access текст не кодируется в кодировке UTF-8, хотя он хранится в Access как символы Unicode. Итак, для примерной таблицы с именем «Команды»

Team
-----------------------
Boston Bruins
Canadiens de Montréal
Федерация хоккея России

код

<?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>

отображает это в браузере

Boston Bruins
Canadiens de Montr�al
????????? ?????? ??????

The Easy, но Неполные исправления

Текст, возвращаемый 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, такими как

<?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>
10
ответ дан Gord Thompson 25 August 2018 в 20:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: