WordPressでUTF8なのに絵文字が保存できる理由→自動でHTMLエンティティに変換してくれているからだった。

私はXサーバーというレンタルサーバーを借りて、その中にWordpressをインストールしてブログを運営しているのですが

そのWordpressで使われているMySQLデータベースは、文字セットが「utf8mb4」じゃなくて「utf8」なんですよね。

参考utf8とutf8mb4の違い【MySQL】

utf8mb4じゃなくてutf8になってる

 

なのでWordpressで4バイトである絵文字(例えば😀←こういう絵文字)は保存できないはずなんです。

なのにですよ。

「絵文字付きの文章を投稿すると、なぜか絵文字が保存できてしまう」という現象が発生したんですよね。

 

これについて「どうなってんの・・?」と思って調べてみたら

どうやら以下のようなWordpressの仕様のせいらしい。

そこでWordPress 4.2では、 wp_insert_post関数内で投稿情報をデータベースへ保存する前段階で、「投稿タイトル」「内容」「抜粋」に含まれる絵文字を数値表現のHTMLエンティティに置き換えるようになっています。

引用:https://elearn.jp/wpman/column/c20150322_01.html

つまり

  • 保存するテーブルの文字セットがutf8の場合
    →投稿に絵文字が含まれていたらHTMLエンティティ(数値文字参照文字実体参照などとも言う)に変換して保存する
  • 保存するテーブルの文字セットがutf8mb4の場合
    →そのまま保存する

みたいな仕様になってるらしい。

HTMLエンティティというのは、例えば😀←この絵文字はUnicodeのコードポイントで表すとU+1F600だから、😀ってHTML本文中に書けば😀が表示される・・みたいな仕組みのやつですね。

試しに、utf8データベースなWordpressにてテキストエディタ(ビジュアルではなくテキスト)に😀と保存したあとにエディタを見てみると、😀の箇所が😀と変換されるのが確認できました↓。

😀▲と打った後に内容を保存すると、&x1f600;というHTMLエンティティに置き換えられている。

逆に、utf8mb4なWordpressのテキストエディタ上で😀と打って保存しても、HTMLエンティティに変換されずに、😀のまま保存されているのが確認できました

  • 確認したWordpressのバージョン:5.5

はぇ~Wordpressちゃん親切だなぁ・・。

 

ちなみに、utf8の場合に、HTMLエンティティに変換してくれるのは絵文字だけっぽいので、他の4バイト文字を保存しても消されちゃうみたいです。

例えば、𩸽(ホッケ)という漢字を本文中に使用してから保存しても、𩸽が本文中から削除されて保存されます。

ついでに言うと

  • 4バイト絵文字(例:😀)
  • 4バイト漢字(例:𩸽)

の両方を使っていると、𩸽の削除に巻き込まれて、😀のほうも削除されちゃうみたいです。よくわからんけどそういう仕様みたいです。

 

あと、エディタをテキスト→ビジュアルに切り替えると、&x1f600;と書かれている部分が😀に変換され、再度ビジュアル→テキストに切り替えても😀のままみたいです。

 

おわり

コメント

タイトルとURLをコピーしました