Php Utf-8:成功转换为iso-8859-1,但未转换为iso-8859-2

Php Utf-8:成功转换为iso-8859-1,但未转换为iso-8859-2,php,sql,ms-access,iso-8859-1,iso-8859-2,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){

我在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'])) . ' ';
        }
试试看{
$db=new-PDO(“odbc:DRIVER={Microsoft-Access-DRIVER(*.mdb,*.accdb)};DBQ=$dbName;Uid=Admin;Pwd=;”;
}
捕获(PDO$e){
echo$e->getMessage();
}
$answer=$db->query(“从dict_main中选择*,其中ID<20”);
而($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']))”;
}
如果有人有什么想法,请告诉我,因为我的想法快用完了,似乎什么都不管用,或者我是否应该提供更多关于我没有想到的问题的信息。

看起来像。因此,它可能会在到达
iconv()
之前中断
$data['PL']
的内容

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

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

您正在使用PHP5.3.13。然后我希望
newpod
中的字符集能够完成它的工作。(在5.3.6之前,您必须使用
$db->exec(“set names utf8”);
)。因此,添加
charset=utf8连接到您的连接线。我还希望您的Access数据库是UTF-8

您也可以尝试
charset=ucs2带和不带
htmlspecialchars(iconv(“iso-8859-2”、“utf-8”、$data['PL'))

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");
$conn=odbc\u connect(“驱动程序={Microsoft Access驱动程序(*.mdb,*.accdb)};DBQ=$dbName;Uid=Admin;Pwd=;charset=utf8“,”,”);
$rs=odbc_exec($conn,“从dict_main中选择*,其中ID<20”);
odbc_结果_all($rs,“border=1”);

您是否尝试过其他php函数对对话进行编码,如mb\u convert\u编码?是的,同样的结果不幸的是,您的php版本是什么,您访问数据库的编码是什么?(我以为access总是使用utf-8)php Versionoon 5.3.13,对于access数据库的编码,我不知道在access中哪里可以找到这些信息(我使用access 2013)谢谢你的建议。但它不起作用,同样的结果是,“?”而不是正确的字符。@George Hum,让我们试着缩小范围。echo iconv(“iso-8859-2”、“utf-8”、“$data['PL'])的输出是什么?(注意我刚才在上面的回答中纠正的打字错误:iso-8859-1=>iso-8859-2)哦,让我们确保您的
iconv
也支持这种编码。请在shell中检查:
iconv-l | grep-i iso-8859-2
。打字没问题,我两个都试过了。新建议带来了同样的结果。我想知道问题是否来自Access输出,但我找不到检查/更改database@George我不能肯定地说,因为我根本就不是专家。但是看起来你的源数据库中有一些奇怪的东西。您是否能够确认Access中的字符显示正确?另外,请在您的DSN末尾添加“
charset=UTF-8;
”,以确保在运输过程中不会丢失某些内容。感谢您的帮助。我在做$db->exec(“set names utf8”);和字符集=utf8;,而且彼此没有对方,也没有忘记元中的字符集。然而,同样的问题是,它不能正确显示字符,即使是没有转换的法语或丹麦语字符。我猜问题来自访问,但我在互联网上或文档中找不到原因和方式……可能还有很长的路要走,但你也可以试试
charset=ucs2带和不带iconv。(在回答中更改)我还添加了一些示例代码来检查php/浏览器的输出。我需要标题行。元线路不足以切换到utf-8。至少在我的设置中。谢谢。您的测试代码对我来说显示正确,一般来说,我显示波兰语字符没有问题,只有来自数据库的字符才有问题。我尝试了charset=ucs2,不幸的是这里没有新的结果。所以我们还没有找到解决方案,只是我想问题肯定来自访问。我可以确认,当我使用phpMyAdmin时,我对波兰语字符也没有问题,然后我怀疑这是ODBC问题。您可以尝试直接odbc_connect来排除PDO,但我认为它是Access->odbc。
<meta http-equiv='Content-Type' content='text/html; charset=utf-8'>
$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");