Utf-8:成功转换为iso-8859-1但不转换为iso-8859-2

时间:2013-07-05 18:19:35

标签: php sql ms-access iso-8859-1 iso-8859-2

我有一个关于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'])) . ' ';
        }

如果有人有想法,请告诉我,因为我用完了,似乎什么都没有用,或者我是否应该提供更多关于我没想到的问题的信息。

2 个答案:

答案 0 :(得分:3)

看起来像htmlspecialchars() does not support ISO-8859-2。因此它可能会在$data['PL']之前打破iconv()的内容。

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

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

答案 1 :(得分: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;");

B.T.W。:不要忘记在文档顶部将输出设置为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-&gt; 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");