【问题标题】:Utf-8: successful conversion to iso-8859-1 but not to iso-8859-2utf-8:成功转换为 iso-8859-1 但未成功转换为 iso-8859-2
【发布时间】:2013-07-03 21:45:18
【问题描述】:

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

如果有人有想法,请告诉我,因为我的想法已经用完了,而且似乎没有任何效果,或者我是否应该提供有关我没有想到的问题的更多信息。

【问题讨论】:

  • 您是否尝试过其他 php 函数来对会话进行编码,例如 mb_convert_encoding ?
  • 是的,不幸的是同样的结果
  • 你的 php 版本是什么,你访问数据库的编码是什么? (我认为访问总是使用 utf-8)
  • php 版本 5.3.13,对于 access-database 的编码,我不知道在 Access 中哪里可以找到这些信息(我使用 Access 2013)

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


【解决方案1】:

您使用的是 PHP 5.3.13。然后我希望new POD 中的字符集能够完成它的工作。 (在 5.3.6 之前。您必须使用 $db-&gt;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->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");

【讨论】:

  • 感谢您提供的所有帮助。我正在做这两个 $db->e​​xec("set names utf8");和charset=utf8;,也各有各的,别忘了meta里的charset。然而同样的问题,它不能正确显示字符,即使没有转换的法语或丹麦语也不行。我想问题出在 Access 上,但我在 Internet 或文档中找不到任何地方为什么以及如何...
  • 也许是一个很长的镜头,但你也可以尝试charset=ucs2; 有和没有 iconv。 (改变了我的答案)
  • 我还添加了一些示例代码来检查您的 php/浏览器的输出。我需要标题行。元行不足以切换到 utf-8。至少在我的设置中。
  • 谢谢。您的测试代码对我来说正确显示,我一般显示波兰语字符没有问题,只有来自数据库的那些是问题。我尝试了charset=ucs2,不幸的是这里没有新的结果。所以我们还没有找到解决方案,只是问题肯定来自我猜的 Access。我可以确认,当我使用 phpMyAdmin 时,波兰语字符也没有问题
  • 那我怀疑是 ODBC 问题。您可以尝试直接 odbc_connect 排除 PDO,但我认为它是 Access->ODBC。
【解决方案2】:

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

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

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

【讨论】:

  • 感谢您的建议。但它没有用,同样的结果,“?”而不是正确的字符。
  • @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 输出,但我找不到检查/更改数据库排序规则的方法
  • @George 我无法确定,因为我根本不是 Access 专家。但它看起来很像你的源数据库中有一些奇怪的东西。您是否能够确认字符在 Access 中正确显示?另外,请在您的 DSN 末尾添加“charset=UTF-8;”,以确保在传输过程中不会丢失任何东西。
猜你喜欢
  • 2011-08-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-29
  • 2014-04-30
  • 2020-10-21
  • 2011-09-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多