Intereting Posts
Рамочный поиск предстоящего проекта Вызов двух хранимых процедур в mysqli вызывает ошибку «Commands out of sync» Создание «робота» для заполнения формы несколькими страницами в PHP – getimagesize () перенаправление не работает doctrine2 queryBuilder должен возвращать только соответствие результата с значениями массива (ids): 0 / Null и / или один и / или многие id (ы) должны возвращать один результат После того, как поле aliasing sql выбрано, я не могу получить доступ к результату в php Некоторые проблемы с переходом от одной функции к другой в цикле в php php reflection получает свойства без получения свойств базового класса получить родительский объект из объекта PHP регулярное выражение для расшифровки английского и китайского символов date_create_from_format () возвращает неправильное значение. Подключения PHP к MySQL SSL Идентификатор пользователя Drupal Session для независимого скрипта Лучший способ интернационализации простого PHP-сайта Уникальные идентификаторы в таблице соединений symfony2

Не удалось получить символы с акцентом UTF-8 из Access через PDO_ODBC

Я пытаюсь получить DB Access, преобразованный в MySQL. Все работает отлично, ожидайте один большой ключ обезьяны … Если у доступа db есть какие-то нестандартные символы, это не сработает. Мой запрос скажет мне:

Incorrect string value: '\xE9d' 

Если я непосредственно выхожу из текста строк, который имеет «недопустимый» символ, я получаю знак вопроса на черном квадрате в моем браузере (поэтому é превратится в этот неверный символ в эхо).

ПРИМЕЧАНИЕ. То же самое будет принимать, сохранять и отображать «é» fine в текстовом поле, которое используется для заголовка этой загрузки db. Также, если я сохраню как «страницу и снова открою ее, то« é »будет отображаться правильно ….

Вот как я подключаюсь:

 $conn = new PDO("odbc:Driver={Microsoft Access Driver (*.mdb)};Dbq=$fileLocation;SystemDB=$securefilePath;Uid=developer;Pwd=pass;charset=utf;"); 

Я пробовал много вещей, в том числе:

 $conn -> exec("set names utf8"); 

Когда я пытаюсь использовать «CurrentDb.CollatingOrder» в доступе, он говорит мне, что 1033, по-видимому, является dbSortGeneral для «порядка сортировки английского, немецкого, французского и португальского языков».

Что не так? Это похоже на то, что PDO отправляет мне сортировку моего браузера, а PHP не полностью понимает.

Проблема

При использовании собственных функций PHP ODBC (PDO_ODBC или более odbc_ функций odbc_ ) и драйвера доступа ODBC текст не кодируется в кодировке 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 ????????? ?????? ?????? 

Легкие, но неполные исправления

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