我有一个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
在通过给定的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值)
您应该尝试在实体管理器的配置中添加一个名为charset的额外参数:
$conn = array(
'driver' => 'pdo_mysql',
'host' => 'hostname',
'user' => 'user',
'password' => 'pass',
'dbname' => 'dbname',
'charset' => 'utf8'
);
$entityManager = DoctrineORMEntityManager::create($conn, $config);