CakePHP3で絵文字を表示したい

絵文字、表示したいですよね。

今はスマホ主体だと思うので、絵文字が使えるに越したことないです。

感情が伝わりやすいですからね。

そこで絵文字表示するちょっとした設定を見ていきます。

【自分の環境】
macOS Catalina
PHP7.4.2
CakePHP3.8
MAMP5.7
Apache2.2
MySQL5.7

デフォルトでは絵文字が無効になる

自分はMAMP環境でphpMyAdminを使っていたので、それで説明していきます。

CakePHP3のデフォルト設定では無効になってるんですね。

たぶん照合順序というものが「utf8_general_ci」とか「utf8_unicode_ci」とかになってます。

ざっくり言うと「utf8」系ではなく「utf8mb4」系にしましょう。

自分は「utf8mb4_general_ci」にしています。

問題点…ただ照合順序を変えるだけではダメ

照合順序を変えると、文字データの大きさが4/3倍になるらしいです。

だいたいデフォルトだとstring(varcher)は255文字だと思うんですけど、それでは後々DBをインポートできないなどの痛い目に遭います。

なので文字数を191にします。

なぜ191文字かと言うと、4バイトの文字が191文字分なので764バイト…これはMySQLの限界は最大767 バイトを下回るからだそうです。

自分の場合はユーザー名でもコメントでも何でも191より下の数にしました。

あとで整合性がなくなるので、phpMyAdminをいじるのではなく、マイグレーションでいじりましょう。

また人によってはMySQLの限界を変える方法を取る方もいます。

ですが自分は設定が上手くいかず、本番環境でインポートできなかったので、191文字に削減で行っています。

コードを書き換えていく

以下の2つをやっていきます。

①app.phpでの設定

②ビューテンプレート(レイアウトテンプレート)を書き換え

①app.phpでの設定

まずapp.phpですが、以下に書き換えます。

'Datasources' => [
        'default' => [
           (中略)
            /*
             * You do not need to set this flag to use full utf-8 encoding (internal default since CakePHP 3.6).
             */
            'encoding' => 'utf8mb4', // コメントアウトする行
            'timezone' => '+09:00',
            'flags' => [],
           (中略)

コメントアウトする行と書きましたが、元々「'encoding' => 'utf8mb4'」となっているので、そう書きました。

コメントアウトしてあげると、データベースの設定がutf8mb4になるみたいです。

②ビューテンプレート(レイアウトテンプレート)を書き換え

残りはビューテンプレート(レイアウトテンプレート)を書き換えです。

いつものようにだと文字コードを「utf-8」にしていると思います。

それを「utf-8mb4」にしていきます。

以下はレイアウトテンプレートの一部です。

参照してください。

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8mb4"> // この行が大事
    <title><?= "サービス名" ?></title>

mb4を付け足すかんじですね。

これで表示ができます。

終わりに

以上となります。

絵文字表示はできればやりたいですよね。

ぜひやってみてください。

ありがとうございました。