我最近开始使用 Web 角色和 SQL azure 后端在 Azure 云上建立一个 drupal 7 网站。我非常高兴,直到我遇到了字符集砖墙。
我有一台使用 Windows Server 2008 R2、IIS 7.5、SQL Server 2008 R2 作为开发服务器的虚拟机,在将它们上传到云之前尝试进行更改。我在 drupal 数据库中有一些额外的表来支持我的应用程序自定义模块。除其他外,在某些时候我需要运行一些这样的代码:
$r = db_select('my_creators', 'c')
->fields('c')
->condition('my_url', $creator_url)
->execute()
->fetchAll(PDO::FETCH_ASSOC);
$creator = $r[0];
foreach ($creator as $k => $vv)
$s.= t('@key -->> @value<br>', array('@key' => $k, '@value' => $v));
print $s;
我已经删掉了很多额外的代码,但是当 $creator_url 的值带有一些特殊字符(例如 André_Breton)时,这是有问题的代码。这在我的开发机器上完美运行,获取记录并显示数据,所以当我上传到云端并收到此错误时,我感到非常惊讶
PDOException:SQLSTATE [IMSSP]:将输入参数 7 的字符串转换为 UCS-2 时出错:目标多字节代码页中不存在 Unicode 字符的映射。在 dblog_watchdog() 中(E:\sitesroot\0\modules\dblog\dblog.module 的第 157 行)。
底层数据库是相同的,实际上我每天将 sql azure 数据库数据同步到开发 sql server 数据库。所有字符数据字段都是 nvarchar。
我交叉检查了 IIS、php、php 扩展、php.ini 的所有版本,所有版本都是相同的。
我设法通过添加来解决这个问题
Database::getConnection()->setAttribute(PDO::SQLSRV_ATTR_ENCODING, PDO::SQLSRV_ENCODING_SYSTEM);
$creator_url = iconv('UTF-8', 'UCS-2', $creator_url);
在选择之前,然后用于打印
foreach ($creator as $k => $vv) {
$v=iconv('ISO8859-1', 'UTF-8', $vv);
$s.= t('@key -->> @value<br>', array('@key' => $k, '@value' => $v));
}
使用此解决方法选择通过,选择并显示正确的记录,但随后我收到几个警告
警告:htmlspecialchars():check_plain() 中的参数中的无效多字节序列(E:\sitesroot\0\includes\bootstrap.inc 的第 1572 行)。警告:htmlspecialchars():check_plain() 中的参数中的无效多字节序列(E:\sitesroot\0\includes\bootstrap.inc 的第 1572 行)。
这是有道理的,因为通常 drupal 函数期望所有字符串都是 UTF-8。
我现在正在用头撞墙几天,任何帮助将不胜感激。
谢谢!