「情報交換用に推奨される絵文字のリスト」を作ってみた
前回,絵文字についてちょろんと調べた余波で絵文字の一覧を作ってみた。
本当はひとつの表にしたかったのだが,ページのレイアウトが崩れまくるので2つに分けた。 まぁ,それでも携帯端末で見たら崩れてると思うけど。
今回の一覧を作るにあたって Unicode の公式ページから以下の情報を拾って使っている。
なお markdown shortcodes の情報の取得には以下のパッケージを使った。 ありがたや。
このパッケージは Hugo でも使われているので「絵文字と Markdown Shortcodes」にある markdown shortcodes は全て Hugo で使える。
なにせ量が量なので手作業でやるわけにもいかず,データ取得用のパッケージを作った。
中身は JSON データ作成用のモジュールと作成した JSON ファイルを読み込むモジュールに別れている。
JSON データ作成用のモジュールで作成した JASON ファイルは,パッケージの json/
ディレクトリに置いている。
JSON データを読むための構造体定義も同じところに置いているので,ご利用はご自由にどうぞ。
絵文字の構造
今回利用したデータの中身については以下のページに公式の解説がある。
以降で簡単に紹介してみる。
Emoji Characters
まず Unicode 符号点単位の「絵文字文字(emoji characters)」には文字種ごとに以下のプロパティが付与されている。
プロパティ | 種別 |
---|---|
Emoji |
emoji character |
Extended_Pictographic |
extended pictographic character |
Emoji_Presentation |
default emoji presentation character |
Emoji_Component |
emoji component |
Emoji_Modifier |
emoji modifier |
Emoji_Modifier_Base |
emoji modifier base |
これらのプロパティは独立に付与されていて,複数のプロパティが付与されている符号点コードもある。
spiegel-im-spiegel/emojis パッケージでは符号点コードごとにプロパティをチェックできるようにした。
type EmojiData struct {
Code rune
Name string
Emoji bool `json:",omitempty"`
EmojiPresentation bool `json:"Emoji_Presentation,omitempty"`
EmojiModifier bool `json:"Emoji_Modifier,omitempty"`
EmojiModifierBase bool `json:"Emoji_Modifier_Base,omitempty"`
EmojiComponent bool `json:"Emoji_Component,omitempty"`
ExtendedPictographic bool `json:"Extended_Pictographic,omitempty"`
RegionalIndicator bool `json:"Regional_Indicator,omitempty"`
VariationTextStyle string `json:",omitempty"`
VariationEmojiStyle string `json:",omitempty"`
}
Emoji Presentation Sequences
Emoji
プロパティが付与されている符号点コードの直後に絵文字表示セレクタ U+FE0F VARIATION SELECTOR-16
を付けることで絵文字であることを明示できる。
といっても何でも組み合わせればいいというわけではないようで,先ほどの emoji-variation-sequences.txt
で定義されているシーケンスのみ有効らしい。
U+FE0F VARIATION SELECTOR-16
には Emoji_Component
プロパティが付与されている。
Emoji Modifiers
Emoji_Modifier_Base
プロパティが付与されている符号点コードに Emoji_Modifier
プロパティが付与されている符号点コードを付けることでEmoji_Modifier_Base
プロパティが付与されている符号点コードの絵文字を装飾できる。
といって現在は肌色のトーンを変更する符号点コードしかないのだが。 肌色の異体字については前回の記事を参照のこと。
Emoji Flag Sequence
Emoji_Component
プロパティを持つ符号点コードの中に Regional Indicator に分類されるコードがあるのだが,このコードのうち2文字を組み合わせて国別コードを構成すると国旗の絵文字になるというトンデモ仕様がある。
これについても前回の記事を参照のこと。
Emoji Tag Sequence (ETS)
まず,文字種を以下のように定義する
tag_base := emoji_character | emoji_modifier_sequence | emoji_presentation_sequence
tag_spec := [\x{E0020}-\x{E007E}]+
tag_end := \x{E007F}
これを使って
emoji_tag_sequence := tag_base tag_spec tag_end
と定義されるのが emoji tag sequence の構成である。
tag_spec
および tag_end
に含まれる符号点コードには Emoji_Component
プロパティが付与されている。
Unicode v13 現在は subdivision-flag のみ実装されているようだ。 これについても前回の記事を参照のこと。
Emoji Keycap Sequence
emoji_keycap_sequence := [0-9#*] \x{FE0F 20E3}
たったこれだけのためのシーケンス。 なんだかなぁ。
ちなみに [0-9#*]
はただの半角文字だが Emoji_Component
プロパティが付与されている。
また U+20E3
にも Emoji_Component
プロパティが付与されている。
Emoji ZWJ Sequence
emoji_zwj_element := emoji_character | emoji_presentation_sequence | emoji_modifier_sequence
としたときに
emoji_zwj_sequence := emoji_zwj_element ( ZWJ emoji_zwj_element )+
で構成される絵文字。
ちなみに U+200D ZWJ
は Emoji_Component
プロパティが付与された結合子で,これを使っていくらでも文字を繋げられるのが恐ろしい点である。
といっても情報交換用として推奨される組み合わせが emoji-zwj-sequences.txt
で定義されているので,この中から選択することになるだろう。
絵文字の分類
結局,絵文字の分類は以下のようになるらしい。
- emoji sequence
- emoji core sequence
- emoji character
- emoji presentation sequence
- emoji keycap sequence
- emoji modifier sequence
- emoji flag sequence
- emoji zwj sequence
- emoji tag sequence
- emoji core sequence
emoji character が emoji core sequence に含まれている点に注目。
で, “UTS #51: Unicode Emoji” に絵文字を判別するための正規表現ってのが載っていたのだが
いやいやいや。 符号点コードごとに絵文字プロパティをチェックせんとアカンのかい! これは面倒くさい。
emoji-sequences.txt
および emoji-zwj-sequences.txt
ファイルでは収録している絵文字を以下のように分類している。
分類名 | 内容 |
---|---|
Basic_Emoji |
Emoji_Presentation プロパティを含む emoji character または Emoji_Presentation プロパティを含まない emoji character の emoji presentation sequence で構成された絵文字 |
Emoji_Keycap_Sequence |
emoji keycap sequence で構成された絵文字 |
RGI_Emoji_Flag_Sequence |
emoji flag sequence で構成される推奨絵文字 |
RGI_Emoji_Tag_Sequence |
emoji tag sequence で構成される推奨絵文字 |
RGI_Emoji_Modifier_Sequence |
emoji modifier sequence で構成される推奨絵文字 |
RGI_Emoji_ZWJ_Sequence |
emoji zwj sequence で構成される推奨絵文字 |
ちなみに RGI は “Recommended for General Interchange” の略だそうだ。 超意訳するなら「情報交換用の推奨絵文字」ってところかねぇ。 なお「情報交換用に推奨される絵文字のリスト」ではこの分類を表示している。 また spiegel-im-spiegel/emojis パッケージでは絵文字シーケンスごとにこの分類をセットしている。
type SequencesType int
const (
TypeUnknown SequencesType = iota
TypeBasicEmoji
TypeEmojiKeycapSequence
TypeRGIEmojiFlagSequence
TypeRGIEmojiTagSequence
TypeRGIEmojiModifierSequence
TypeRGIEmojiZWJSequence
)
type EmojiSequence struct {
Sequence string
Name string
SequenceType types.SequencesType
Shortcodes []string `json:",omitempty"`
}
これで絵文字の調査は一段落かな。 とりあえずチョー面倒くさいのは分かった。