1. Qiita
  2. 投稿
  3. WordPress

ProjectNami で Unicode 文字列を扱う

  • 0
    いいね
  • 0
    コメント

    Azure SQL Database/SQL Server で WordPress を動作させるソリューションに ProjectNami があります。

    標準の状態で日本語を扱うには、サーバーの照合順序を Japanese_CI_AS にする必要があります。
    しかし、この状態ですと、cp932 の文字集合の範囲外の文字列は文字化けしてしまいます。

    スマートフォンでよく使用される絵文字が文字化けしてしまうため、巷では、寿司ビール問題 と呼ばれています。これ防ぐには、 Nプレフィックスを付与する 必要があります。

    以下のような修正で、 UTF-8 でのデータベース接続が有効になり、照合順序を SQL_Latin1_General_CP1_CI_AS としても文字化けせずに投稿できます。
    もちろん、絵文字など、特殊な文字列の使用も可能です。

    utf-8.patch
    diff --git a/wp-config.php b/wp-config.php
    index a1a9449..7382888 100644
    --- a/wp-config.php
    +++ b/wp-config.php
    @@ -36,7 +36,8 @@ define('DB_HOST', ( getenv('ProjectNami.DBHost') ? getenv('ProjectNami.DBHost')
     define('DB_CHARSET', 'utf8');
    
     /** The Database Collate type. Don't change this if in doubt. */
    -define('DB_COLLATE', '');
    +define('DB_COLLATE', 'SQL_Latin1_General_CP1_CI_AS');
    +putenv('ProjectNami.UTF8=1');
    
     /**#@+
      * Authentication Unique Keys and Salts.
    diff --git a/wp-includes/wp-db.php b/wp-includes/wp-db.php
    index 409d4a8..afa56ff 100644
    --- a/wp-includes/wp-db.php
    +++ b/wp-includes/wp-db.php
    @@ -1290,7 +1290,7 @@ class wpdb {
                    $query = str_replace( "'%s'", '%s', $query ); // in case someone mistakenly already singlequoted it
                    $query = str_replace( '"%s"', '%s', $query ); // doublequote unquoting
                    $query = preg_replace( '|(?<!%)%f|' , '%F', $query ); // Force floats to be locale unaware
    -               $query = preg_replace( '|(?<!%)%s|', "'%s'", $query ); // quote the strings, avoiding escaped strings like %%s
    +               $query = preg_replace( '|(?<!%)%s|', "N'%s'", $query ); // quote the strings, avoiding escaped strings like %%s
                    array_walk( $args, array( $this, 'escape_by_ref' ) );
                    return @vsprintf( $query, $args );
            }
    

    See Also