我最近开始使用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é_布雷东)。这在我的开发机器上运行得很好,获取记录并显示数据,所以当我上传到云端并得到这个错误时,我非常惊讶PDOException: SQLSTATE[IMSSP]: An error occurred translating string for input param 7 to UCS-2: No mapping for the Unicode character exists in the target multi-byte code page. in dblog_watchdog() (line 157 ofE:\sitesroot\0\modules\dblog\dblog.module).
底层数据库是相同的,实际上我每天都将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));
}
使用此解决方法,选择过程将完成,正确的记录将被选择并显示,但随后我会收到几个警告Warning: htmlspecialchars(): Invalid multibyte sequence in argument in check_plain() (line 1572 ofE:\sitesroot\0\includes\bootstrap.inc). Warning: htmlspecialchars(): Invalid multibyte sequence in argument in check_plain() (line 1572 ofE:\sitesroot\0\includes\bootstrap.inc).
个
这是有意义的,因为Drupal函数通常期望所有字符串都是UTF-8。
我现在有几天都在碰壁,任何帮助都将不胜感激。
谢谢你,谢谢你
1条答案
按热度按时间f0ofjuux1#
我不熟悉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中,则可能会遇到此问题。在这种情况下,请尝试对该字符进行转义。例如,您可以定义一个规则,使“/mypecialcharacter”对应于UTF-16中不存在的特殊字符。我建议您在PHP端进行转义/取消转义。
顺祝商祺!
明虚。