前置き
Ruby on RailsでWebアプリを作っている途中で正規表現で絵文字を引っ掛けることはできないかと考え、たどり着いた答えを自分用に残しておきます。
結論から述べると絵文字がunicodeのutf-8の中の4byteの文字であることを利用しました。
UTF-8の文字コード表
ここでまとめてくださっている情報によると、現在わたしたちが絵文字と呼んでいる文字たちはコードポイントでいうと主に「U+1F300」から始まっています。
Unicodeがどんな風にUTF-8に割当てられているか
さらに、同サイトの中で4byte文字はコードポイントでいうと「U+10000〜U+1FFFFF」であることが述べられています。
ざっくりメモ
Unicode→あらゆる文字を16進数の数字に変換したもの、コードポイントの集合体
<コードポイントの例>
あ→U+3042
い→U+3044
🌱→U+1F331
UTF-8→Unicodeをさらに符号に変換する方式の一つ
<変換した例>
あ→E38182
い→E38183
🌱→F09F8CB1
Unicodeのコードポイントをそのままパソコンに理解させるよりもUTF-8などによる符号を使う方がバイト削減できるため、UTF-8で符号化している。
【図解】【3分解説】UnicodeとUTF-8の違い!【今さら聞けない】
@omiita 様より引用
バリデーション方法
具体的にどのようにバリデーションしたかというと、コードポイントで4byteの文字を指定しました。
正規表現でのコードポイント記法
はじめての正規表現とベストプラクティス#7: Unicode文字ポイントとUnicode文字クラスのプロパティ
hachi8833様より
具体的な文字範囲
UTF-8の4バイト文字のバリデーション
UTF-8にエンコードすると4バイトになるUnicode文字の範囲は、U+10000からU+10FFFFである。
Pistolfly様より
上記の記事により、Rubyでコードポイントを用いて、絵文字(4byte文字)をバリデーションする正規表現を書く時は
/[\u{10000}-\u{10FFFF}]/
となります。
実際にRubularで確認してみると、、、
うまくいきました。
Rubular