ルモーリン
ホーム 更新 Perl Sample サービス 雑談 鉄ゲタ Linux リンク 連絡先

絵文字を含む文字列を分割するサービス

2019-07-27

絵文字は複数のコードポイントで構成(されることもある)

これとかコードポイント8個で構成されています→「👩‍❤️‍💋‍👨(👩‍❤️‍💋‍👨)」
たこルカ(コードポイント1個)→「🐙(🐙)」
ルカ姐さん(コードポイント3個)→「👩‍🎤(👩‍🎤)」

文字単位に分割するサービス

分割するのは面倒なのでサービス作った。

テキスト:

処理:



解説

Perlの正規表現には1文字にマッチするメタ文字として「\X」があります。 Perl5.28以降は絵文字を含む「1文字」にマッチするようになりました(5.28.2で確認済)。 もちろん普通(?)の1文字にもマッチしますから絵文字かどうかは分かりません。 そこでツイッター社の絵文字ライブラリからアーカイブを拝借、「絵文字のファイルがあるコードポイントの並びは絵文字」と判定します。 コードはこんな感じです。

# $text(対象文字列) → @char(分割した文字情報)
for ($text =~ /\X/g) {
	# 文字毎に分割(コードポイントは複数)

	my $char;
	$char->{char} = $_;

	# コードポイント毎に分割、16進表記
	my @char_hex = map {sprintf "%x", ord} split //;
	$char->{hex} = \@char_hex;

	# ツイッター社の絵文字ライブラリに同名の画像ファイルがあれば絵文字
	my $emoji_hex = join "-", @char_hex;
	$char->{is_emoji} = -e "/??????????/emoji/$emoji_hex.png" ? 1 : 0;

	push @char, $char;
}

参考資料

「文字クラス及び他の特殊なエスケープ」perlre - Perl 正規表現 - perldoc.jp
GitHub - twitter/twemoji: Emoji for everyone.

付録:便利なAPI付き

JSONで文字列を投げると文字単位に分割、絵文字フラグも付けて返す便利なAPIになってます。 この下にJavaScriptがあるのでソースを見てご利用ください。