Closed5

おそるべき絵文字

Zenn 記事投稿時にちょっと気になることがあって issue を投げたのだが

https://github.com/zenn-dev/zenn-roadmap/issues/224

じゃあ,どこからどこまでが「絵文字」なんだろうと気になってちょっと調べてみた。

情報歓迎

まずは Wikipedia を起点にするのがいいのかな,と思ったが

https://ja.wikipedia.org/wiki/UnicodeのEmojiの一覧

なんか * とか 0 とかの記号・数字まで絵文字とか言ってくさる。えー?
こういうときはご本家に聞いてみよう。

https://unicode.org/emoji/charts/full-emoji-list.html

これを見ると,絵文字 #️⃣ は

Unicode Point 字形 Unicode 名称
U+0023 # NUMBER SIGN
U+FE0F VARIATION SELECTOR-16
U+20E3 COMBINING ENCLOSING KEYCAP

という合成列らしい。えー。絵文字異体字セレクタの後ろに更に結合文字が付くのかよ。しかも基底文字はただの半角記号だよ orz

これはヤバい匂いしかしない。興味本位で手を出していい案件じゃなかった!!

おそるべき絵文字の深淵を垣間見てしまったわけだが,これで思い出した記事がある。

https://text.baldanders.info/remark/2017/12/character-of-the-new-era-name/

まぁ「技術的負債」と口走ったのは私の黒歴史としてスルーしていただけるとありがたいが,よく考えたら「㍻ U+337B」とかを「文字」だと思うから不合理に感じるのであって「絵文字」と思えばアリなのか。

ちなみに,先日本家ブログで書いた

https://text.baldanders.info/golang/unicode-rangetables/

で紹介した方法で確認してみたら「㍻ U+337B」は "Symbol/other" に分類されるようだ。つまり(絵文字ではないが)絵文字と同等ということ。

ちなみに,今回 Go で大雑把な文字種のチェックを行うのに以下の関数を書いてみた。

import "unicode"

func check(r rune) string {
    switch {
    case unicode.Is(unicode.Variation_Selector, r):
        return "Variation Selector"
    case unicode.Is(unicode.Sc, r):
        return "Symbol/currency"
    case unicode.Is(unicode.Sk, r):
        return "Symbol/modifier"
    case unicode.Is(unicode.Sm, r):
        return "Symbol/math"
    case unicode.Is(unicode.So, r):
        return "Symbol/other"
    case unicode.Is(unicode.Lm, r):
        return "Letter/modifier"
    case unicode.Is(unicode.Lo, r):
        return "Letter/other"
    case unicode.Is(unicode.Nl, r):
        return "Number/letter"
    case unicode.Is(unicode.No, r):
        return "Number/other"
    case unicode.Is(unicode.Mc, r):
        return "Mark/spacing combining"
    case unicode.Is(unicode.Me, r):
        return "Mark/enclosing"
    case unicode.Is(unicode.Mn, r):
        return "Mark/nonspacing"
    case unicode.Is(unicode.Pc, r):
        return "Punctuation/connector"
    case unicode.Is(unicode.Pd, r):
        return "Punctuation/dash"
    case unicode.Is(unicode.Pe, r):
        return "Punctuation/close"
    case unicode.Is(unicode.Pf, r):
        return "Punctuation/final quote"
    case unicode.Is(unicode.Pi, r):
        return "Punctuation/initial quote"
    case unicode.Is(unicode.Ps, r):
        return "Punctuation/open"
    case unicode.Is(unicode.Po, r):
        return "Punctuation/other"
    case unicode.Is(unicode.Zl, r):
        return "Separator/line"
    case unicode.Is(unicode.Zp, r):
        return "Separator/paragraph"
    case unicode.Is(unicode.Zs, r):
        return "Separator/space"
    case unicode.IsGraphic(r):
        return "Graphic"
    case unicode.Is(unicode.Join_Control, r):
        return "Join Control"
    case unicode.Is(unicode.Cc, r):
        return "Control/control"
    case unicode.Is(unicode.Cf, r):
        return "Control/format"
    case unicode.Is(unicode.Cs, r):
        return "Control/surrogate"
    case unicode.Is(unicode.Co, r):
        return "Control/private use"
    }
    return "Unknown"
}

長いコードで恐縮だが,ちょこっと文字種を調べるのには使えるだろう。

このスクラップは2021/02/21にクローズされました
ログインするとコメントできます