我在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'])) . ' ';
}
如果有人有想法,请告诉我,因为我已经用完了,似乎什么都不起作用,或者我是否应该提供更多我没有想到的关于我的问题的信息。
看起来htmlspecialchars()
不支持ISO-8859-2。因此,它可能在到达iconv()
之前就破坏了$data['PL']
的内容。
首先尝试将输入字符串转换为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。
您也可以尝试使用和不使用htmlspecialchars( iconv("iso-8859-2", "utf-8", $data['PL']) );
的charset=ucs2;
$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->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");