Zenn Tech Blog
🦄

URLで絵文字を指定したらTwemoji画像を返す仕組みを作った(Cloud Functions)

に公開3
Zenn Tech Blog
Zenn Tech Blog

Discussion

rithmetyrithmety

twemoji.maxcdn.com の URI を見た感じでは下記の実装でも問題なさそうですね

const emojiToImgUrl = (emoji: string): string =>
  `https://twemoji.maxcdn.com/2/svg/${
    emoji.match(/./giu).map(t => t.codePointAt(0).toString(16)).join('-')
  }.svg`

emojiToImgUrl('👨‍👩‍👧‍👦')
// 'https://twemoji.maxcdn.com/2/svg/1f468-200d-1f469-200d-1f467-200d-1f466.svg'
catnosecatnose

ありがとうございます。仰る通りだと思います!自分も最初は

 [...emoji].map((x) => x.codePointAt(0).toString(16)).join('-');

という感じで書いていたのですが、

  • 絵文字が2つ渡された場合に1つ目の絵文字URLを返してくれる
  • 前後に絵文字以外のテキストが入り込んでしまった場合にも絵文字のURLを取り出せる

という理由からtwemoji-parserを使うことにしました。

関連

https://zenn.dev/catnose99/scraps/79012f2617ffd9

twemoji-parserの該当部分のソースコード: https://github.com/twitter/twemoji-parser/blob/master/src/index.js

rithmetyrithmety

なるほどです

絵文字が2つ渡された場合に関しては Intl.Segmenter という選択肢もありますが
前後に絵文字以外が入る可能性については確かに正規表現しか無い気がしますね…

const seg = new Intl.Segmenter('ja', { granularity: 'grapheme' })
Array.from(seg.segment('🐱😗'))
// [{"segment":"🐱","index":0,"input":"🐱😗"},{"segment":"😗","index":2,"input":"🐱😗"}]

Unicode はつらい…