Utf-8: успешное преобразование в ISO-8859-1, но не в ISO-8859-2

У меня есть база данных на MS Access, которую я использую с PHP через вызов с PDO и драйвер odbc. У меня есть французские, датские и польские слова в моей базе данных. Нет проблем для французского и датского, но нет возможности получить польские символы, я получаю только "?" вместо.

Вот код:

    try{
 $db = new PDO("odbc:DRIVER={Microsoft Access Driver (*.mdb, *.accdb)}; DBQ=$dbName; Uid=Admin;Pwd=;");
  }
  catch(PDOException $e){
    echo $e->getMessage();
  }
  $answer = $db -> query("SELECT * FROM dict_main WHERE ID < 20");
      while($data = $answer-> fetch() ){
          echo iconv("iso-8859-1","utf-8",htmlspecialchars($data['DK'])) . ' ';
          echo iconv("iso-8859-2","utf-8",htmlspecialchars($data['PL'])) . ' ';
          echo iconv("iso-8859-1","utf-8",htmlspecialchars($data['FR'])) . ' ';
        }

Пожалуйста, дайте мне знать, если у кого-то есть идея, потому что у меня кончается идея, и, кажется, ничего не работает, или если я должен дать больше информации о моей проблеме, о которой я не думал.

2 ответа

Это выглядит как htmlspecialchars() не поддерживает ISO-8859-2. Так что это, вероятно, нарушает содержание $data['PL'] прежде чем он доберется до iconv(),

Попробуйте сначала преобразовать входную строку в UTF-8, а затем применить htmlspecialchars() в строку UTF-8:

echo htmlspecialchars( iconv("iso-8859-2", "utf-8", $data['PL']) );

Вы используете PHP 5.3.13. Тогда я бы ожидал, что кодировка в new POD делать свою работу. (До 5.3.6. Вам придется использовать $db->exec("set names utf8");). Так что добавьте charset=utf8; к вашей соединительной линии. Я также ожидаю, что ваша база данных Access будет UTF-8.

Вы также можете попробовать charset=ucs2; с и без htmlspecialchars( iconv("iso-8859-2", "utf-8", $data['PL']) );

$db = new PDO("odbc:DRIVER={Microsoft Access Driver (*.mdb, *.accdb)}; DBQ=$dbName; Uid=Admin;Pwd=;charset=utf8;");

или же

$db = new PDO("odbc:DRIVER={Microsoft Access Driver (*.mdb, *.accdb)}; DBQ=$dbName; Uid=Admin;Pwd=;charset=ucs2;");

КСТАТИ: Не забудьте установить вывод в UTF-8 в верхней части документа.

<?php header('Content-Type:text/html; charset=UTF-8'); ?>

и / или

<meta http-equiv='Content-Type' content='text/html; charset=utf-8'>

Если это все еще не работает, я подозреваю, что кодировка в вашей базе данных Access испорчена.


Редактировать:

Единственное, о чем я могу думать в данный момент, это использовать odbc_connect напрямую и обходить PDO, но я думаю, что проблема в ODBC (Access->ODBC). Если это так, это не поможет:

$conn=odbc_connect("DRIVER={Microsoft Access Driver (*.mdb, *.accdb)}; DBQ=$dbName; Uid=Admin;Pwd=;charset=utf8", "", "");
$rs=odbc_exec($conn, "SELECT * FROM dict_main WHERE ID < 20");
odbc_result_all($rs,"border=1");
Другие вопросы по тегам