㊗‼‼絵文字対応💯💯💯
経緯
当ブログは今の今まで絵文字に対応していなかった...のである。
主な理由はUnicode絵文字なんてものがまだ普及していない頃に構築したから。
構築当時は今のようにWordpress一強ではなく、むしろ「アクセスする度にページを動的生成するなんてコスト高いなぁ」という時代で、当時まだまだシェアがあったMovable Typeを採用したのを覚えている。
しかしながら、令和の時代にもなって絵文字の一つも使えないとおじさん構文の真似事もできず表現の幅がきついということもあり、重い腰を上げて対応してみた(せっかく重い腰を上げるならWordpressに移行すればよいのでは...)
絵文字対応の要点
古いMovable Typeが絵文字に非対応なのはMySQLデータベースの文字コードによる。
以前はデータベースやテーブルの文字コードにutf8を設定していたが、絵文字に対応するにはマルチバイト文字に対応したutf8mb4に変更する必要がある。照合順序(Collation)も同様にutf8mb4_general_ciに変更する。
公式サイトのマニュアルによると、utf8mb4_converterというデータベース変換ツールが提供されているらしい。
cd /path/to/movabletype
./tools/utf8mb4_converter --db データベース名 --user データベースユーザー名 --pass データベースパスワード
早速レンタルサーバーの管理画面からSSH接続情報を確認してTera Termで接続。
まずはデータベースのバックアップを取り、
mt-config.cgiファイルからデータベース名やユーザー名、パスワードを確認し、上記コマンドを実行してみた。
DBD::mysql::db do failed: Specified key was too long; max key length is 1000 bytes [for Statement "ALTER TABLE mt_asset CONVERT TO CHARSET utf8mb4 COLLATE utf8mb4_general_ci"] at ./utf8mb4_converter line 87.
上記エラーが出て処理終了...絵文字対応できず🤷♂️
エラーメッセージでググってみたらどうやらテーブルのキー項目が長すぎるらしい。
mt_assetテーブルはファイルパス等の長い文字列を格納するカラムが多いので、1文字3バイトなのが4バイトに増えてサイズオーバーしたのが原因か。
ファイルパスに絵文字なんて入れないでしょ🤨
このテーブルだけスキップとかできない...よね...。
手動で頑張るしかない
公式のツールなんてこんなもんだ。正常パターンしか想定していない。
仕方がないのでもう少し検索してみると手動で更新している例を発見。
ということで、4バイト対応に必要な対応は以下の2つ。
1.ODBCドライバーのCharactor setの調整
2.MySQLの該当カラムのCollation(文字コード+ソート順)の調整
1.の方は既に対応が入っているため不要。
2.の方が公式ツールの代わりに実施が必要な作業だ。
phpMyadminでDBにログインして、以下テーブルのカラムの「照合順序」を「utf8_general_ci」から「utf8mb4_general_ci」に変更。(全体設定を変えてもいいのかもしれないが、トラブルも面倒なので対象のみ変更)
・mt_entry
・entry_title(タイトル)
・entry_text(本文)
・entory_text_more(本文続き)
・mt_comment
・comment_text(コメント本文)
・comment_author(コメント投稿者名)
まずはphpMyadminをインストール(これはレンタルサーバーが自動でやってくれた)。
あとはmt_entryテーブルとmt_commentテーブルでそれぞれ①~④の箇所を操作する。
最後に「保存する」ボタンを押すのを忘れずに。
(画像をクリックして拡大)
各項目について、utf8mb4_general_ciになっていることを確認する。
(画像をクリックして拡大)
これで完了。
Movable Typeの方はとくに再構築などは必要なく、すぐ絵文字を使い始めることができた🙌
【追記】また文字化けした
この対応をした後、レンタルサーバーにメンテナンスが入りMySQLがMariaDBに更新された。
DBの移行は業者がやってくれていたみたいだが、見事に絵文字が文字化けしていた...(と言ってもこの記事だけだったが)
新たに記事を作ろうとしても↑この有様。勘弁してくれ。
phpMyAdminで確認してみると、これまでutf8だった文字コードがutf8mb3に代わっていた(手動でutf8mb4に変えた箇所は変わっておらず)。
おそらくMovableTypeがこれを正しく認識できていないと思われる。
上で紹介した記事を参考に、「/lib/MT/ObjectDriver/Driver/DBD/mysql.pm」を修正した。
初めは元コードを参考に下記のように変えてみたがうまくいかなかった。
'utf-8' => $charset_db eq 'utf8mb4' ? 'utf8mb4' : 'utf8mb3',
面倒くさいので全て'utf8mb4'にしたところ上手くいったのでとりあえずこれでOKとする。
既に文字化けしてしまっている絵文字はDB移行の際に文字化けしてしまっており復旧できなかったため手作業で元に戻した。
コメントする