0

我有一个 drupal 表单,它使用 Doctrine 库将用户输入保存到 MySQL 数据库中。问题是,如果用户输入有重音字符,它们在 DB 中看起来不太好。例如,Sempé变成Sempé。这对我来说很奇怪,因为:

  • 它存储到的字段是 utf8:varchar(20) COLLATE utf8_swedish_ci NOT NULL,
  • 该表也是 utf8:ENGINE=InnoDB AUTO_INCREMENT=202 DEFAULT CHARSET=utf8 COLLATE=utf8_swedish_ci
  • 我所有的 php 脚本,包括告诉 drupal 哪些字段要添加到表单中的脚本)都保存为 utf-8
  • drupal 创建的表单接受 utf8:<form enctype="multipart/form-data" action="/drupal/identification" method="post" id="form-identification" accept-charset="UTF-8">
  • drupal 创建的页面以 utf8 格式发送:<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  • php->mysql 连接设置为 utf8:

    $dbParams = array("driver" => "pdo_mysql",
        "host" => variable_get("dbManip_host"),
        "user" => variable_get("dbManip_user"),
        "password" => variable_get("dbManip_password"),
        "dbname" => variable_get("dbManip_dbName"),
        "charset" => "utf8");
    

我也试过:

  • 添加default_charset = "utf8"php.ini
  • utf8_encode在保存之前传递表单数据
  • mb_convert_encoding在保存之前传递表单数据

但这些都没有奏效。

我在这里错过了什么吗?

更新

我查看了浏览器发送到服务器的标头并发现$_SERVER['HTTP_ACCEPT_CHARSET'] === null

4

2 回答 2

1

您应该尝试在实体管理器的配置中添加一个名为 charset 的额外参数:

$conn = array(
  'driver' => 'pdo_mysql',
  'host' => 'hostname',
  'user' => 'user',
  'password' => 'pass',
  'dbname' => 'dbname',
  'charset' => 'utf8'
);

$entityManager = \Doctrine\ORM\EntityManager::create($conn, $config);
于 2012-10-01T22:07:34.157 回答
1

在通过给定的 PHP MySQL 链接提交任何其他查询之前,请尝试:

mysql_query('SET NAMES UTF8');

此语句表明通过同一 MySQL 链接提交的进一步查询将采用 UTF8 字符集。

当您想稍后检索 MySQL 数据并通过 PHP 发布到网页时,请务必在 HTTP 标头中设置字符集:

header('Content-type: text/html; charset=utf-8');

...并在显示的内容中转换为 HTML 实体:

echo mb_convert_encoding($mysql_col_str, 'HTML-ENTITIES', 'UTF-8');

(这个最后的语句假设已经定义了一个变量$mysql_col_str ,其中包含 MySQL 查询返回的 UTF8 值)

于 2012-10-01T22:11:52.723 回答