5

我有一个关于 MS Access 的数据库,我通过调用 PDO 和 odbc 驱动程序与 PHP 一起使用。我的数据库中有法语、丹麦语和波兰语单词。法语和丹麦语没问题,但没有波兰字符,我只得到“?” 反而。

这是代码:

    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'])) . ' ';
        }

请让我知道是否有人有想法,因为我已经用完了他们并且似乎没有任何工作,或者我是否应该提供有关我没有想到的问题的更多信息。

4

2 回答 2

3

看起来htmlspecialchars()不支持 ISO-8859-2$data['PL']所以它可能会在它到达之前破坏iconv().

尝试首先将输入字符串转换为 UTF-8,然后应用htmlspecialchars()到 UTF-8 字符串:

echo htmlspecialchars( iconv("iso-8859-2", "utf-8", $data['PL']) );
于 2013-07-09T12:15:08.030 回答
2

您使用的是 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");
于 2013-07-15T09:37:05.537 回答