php和pdo utf-8通过api的奇怪行为

时间:2015-12-11 19:44:59

标签: php mysql angularjs pdo utf-8

我遇到过与PDO有关的行为,这与UTF-8编码问题有关。

插入数据时,我需要声明SET NAMES UTF-8,以便正确存储数据。好的,这很好。但是!

当选择数据(和获取结果)时,我特别不能设置名称UTF-8,否则字符会被扰乱。或者,如果我使用集合名称UTF-8作为选择,我需要utf8对结果集进行编码(如转换为iso88591),如果我想正确看到它们。这表明我的页面将被解释为iso88591。但是,如果我将页面缩小为单页应用程序(它的angularjs / PHP slim / pdo设置),相同的功能仍然存在 - $ http.post的pdo init的UTF-8名称,并且显式没有用于select / $的设置名称UTF-8 http.get。此外,如果我在从UTF-8整理表中获取结果后死亡并公开数据,我需要解码它们以查看正确的数据。

我在我的数据库适配器构造中做了这个黑客来解决它,但我宁愿解决整个问题,因为它让我很好奇:

$init = array();
if ($write) {
    $init = array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8");
}
$pdo = new PDO('mysql:host=' . DB_HOST . ';dbname=' . DB_NAME, DB_USER, DB_PASS, $init);

一些事实:

  • 所有相关文件均为UTF-8。
  • 所有(搜索,查看,插入)页面都正确地称为“text / HTML; charset = UTF-8”(当然,事实上我将所有功能都缩减为一个页面,但仍然可以复制此场景)< / LI> 来自调试器的
  • 标头翻译为UTF-8。
  • 当在sql insert / select之前的请求参数中在控制器中回显时,PHP检测到字符串(插入和搜索)为UTF-8。
  • PHP ini默认字符集是UTF-8。
  • MySQL数据库和表charset UTF-8和整理UTF-8一般。
  • 编辑是原子。
  • 环境ubuntu 14。

还有其他人遇到过类似的行为吗?这是否必须对使用angular(XHR)发送的标头执行某些操作,因为它们是默认的?虽然请求和params在服务器端被正确解释为UTF-8后所以它看起来很遥远。有可能这可能与环境有神秘的联系,因为它不是一个新的虚拟机,而是一个对它有自己调整的本地开发机器。

0 个答案:

没有答案