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;と書かれている部分が😀に変換され、再度ビジュアル→テキストに切り替えても😀のままみたいです。

 

おわり

Wordpress文字コード
スポンサーリンク
この記事を書いた人
penpen

1991生まれ。
2019年くらいからフロントエンドエンジニアを目指している元アフィリエイターです💩

penpenをフォローする
penpenをフォローする
penpenメモ

コメント

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