最近、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 であることを想定しているため、これは理にかなっています。
私は今、数日間壁に頭をぶつけています。どんな助けでも大歓迎です。
ありがとうございました!