我最近开始使用Web角色和SQL Azure后端在Azure云上建立一个drupal 7网站。我非常高兴,直到我碰到了一个角色设置的砖墙。
我有一个虚拟机,将Windows Server 2008R2,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 字符的映射。 in dblog_watchdog() (第 157 行 ofE:''sitesroot''0''modules''dblog''dblog.module)。
底层数据库是相同的,实际上我每天都会将 sql azure 数据库数据同步到开发 sql 服务器数据库。所有字符数据字段都是 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() 中参数中的多字节序列无效(第 1572 行 ofE:''sitesroot''0''include''bootstrap.inc)。警告:htmlspecialchars():check_plain() 中参数中的多字节序列无效(第 1572 行 ofE:''sitesroot''0''include''bootstrap.inc)。
这是有道理的,因为通常drupal函数期望所有字符串都是UTF-8。
我已经把头撞在墙上几天了,任何帮助将不胜感激。
谢谢!
我不熟悉Drupal或PHP。但根据 http://blogs.msdn.com/b/qingsongyao/archive/2009/04/10/sql-server-and-utf-8-encoding-1-true-or-false.aspx 的说法,SQL Server(以及类似的SQL Azure)并不支持UTF-8。它支持 UTF-16。在大多数情况下,SQL Server将自动转换编码。但是,如果字符存在于 UTF-8 中,但不是 UTF-16,则可能会遇到此问题。在这种情况下,请尝试转义此字符。例如,您可以定义一个规则,以便"/myspecialcharacter"对应于 UTF-16 中不存在的特殊字符。我想建议你在PHP端逃脱/取消逃脱。
此致敬意
徐明.