0

我最近开始使用 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。

我现在正在用头撞墙几天,任何帮助将不胜感激。

谢谢!

4

1 回答 1

0

我不熟悉 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 端转义/取消转义。

此致,

明旭。

于 2012-04-23T09:00:03.020 回答