0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Rubyで絵文字を判定する正規表現

Last updated at Posted at 2023-02-23

前置き

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

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?