0

最近、Web ロールと SQL Azure バックエンドを使用して、Azure クラウド上に drupal 7 Web サイトのセットアップを開始しました。キャラクター セットのブリックウォールにぶつかるまで、私はとても満足していました。

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 サーバー データベースに毎日データ同期しています。すべての文字データ フィールドは 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をサポートします。ほとんどの場合、SQLServerは自動的にエンコーディングを変換します。ただし、文字がUTF-8に存在するが、UTF-16には存在しない場合、問題が発生する可能性があります。この場合、このキャラクターを脱出してみてください。たとえば、「/myspecialcharacter」がUTF-16に存在しない特殊文字に対応するようにルールを定義できます。PHP側でエスケープ/エスケープ解除することをお勧めします。

よろしくお願いします、

明徐。

于 2012-04-23T09:00:03.020 に答える