title: 絵文字入力方法まとめ
author: Amane Katagiri
summary: 新時代の絵文字入力メソッド
date: 2023-11-15T18:32:00+09:00
category: tech
license: CC BY 4.0
rating: sfw
ai_summary: ATOKへ乗り換えた筆者が、Google日本語入力では可能だったショートコードによる絵文字入力を実現する試行錯誤をまとめた記事です。IMEのローマ字テーブル、Windows標準のパレット、PowerToys Runの拡張機能などを比較検討。最終的に、ショートコードをパスカルケース化してATOKのユーザー辞書に一括登録する手法を推奨しており、辞書ファイル生成の工夫や具体的な設定手順について解説しています。
ai_keywords: ATOK, Google 日本語入力, 絵文字, ショートコード, ユーザー辞書, ローマ字テーブル, PowerToys Run, GEmojiSharp, IME, Windows

# はじめに

2021年5月くらいに[Google 日本語入力](https://www.google.co.jp/ime/)から[ATOK](https://atok.com/)に乗り換えて、2年半ほどが経ちました。当時、Google 日本語入力の変換候補が玉石混交で使い物にならなかったので、思い切って500円/月（2022年2月から600円/月）で新たなIMEに乗り換えたのです。

ATOKなら、IMEとスムーズに連携する[校正支援](https://atok.com/other/support/proofread.html)や[訂正学習](https://support.justsystems.com/faq/1032/app/servlet/qadoc?QID=028157)を活用したり、[マンスリーレポート](https://support.justsystems.com/faq/1032/app/servlet/qadoc?QID=056760)を表示できたりします。設定や学習情報のバックアップや同期機能も充実していて、Windowsで登録したユーザー辞書をAndroidから利用できるのもそこそこ便利です。

そんな便利なATOKですが、Google 日本語入力から乗り換えた際に不便になったことがあります。それは、絵文字（Unicode絵文字）の入力方法です。Google 日本語入力では `:muscle:` :arrow_right: :muscle: のようなショートコードを使ったローマ字テーブルを登録することで、GitHubやSlackのような手触りを得られるのですが、悲しいことにこのハックはATOKでは利用できません。

この記事では、動作環境やIMEの違いを踏まえて、これまでの絵文字入力とのお付き合いについて振り返っていこうと思います。

[TOC]

# 入力方法まとめ

## IMEのローマ字テーブル

- 環境: Mozc + Linux :arrow_right: Google 日本語入力 + Windows

この方法は、[IME でも `:muscle:` みたいに Emoji を入力したい！](https://pocke.hatenablog.com/entry/2017/03/05/193553)で解説されているものです。外部のショートコード[^shortcode]と絵文字のエンティティを接続するJSONファイル[^emojitable]をTSVファイルに変換し、これをローマ字テーブルとして利用することで、 <kbd>:</kbd><kbd>m</kbd><kbd>u</kbd><kbd>s</kbd><kbd>c</kbd><kbd>l</kbd><kbd>e</kbd><kbd>:</kbd> というキーストロークから「 :muscle: 」という絵文字を入力できます。

[^shortcode]: 特定のUnicode絵文字を指す `:muscle:` などの `:` で挟まれた英数字列です。

[^emojitable]: 参照先の記事（2017年）では[joypixels/emojione](https://github.com/joypixels/emojione)が紹介されていますが、こちらは2019年でアーカイブされたので、最近の絵文字が含まれていません。今から生成する場合は[joypixels/emoji-toolkit](https://github.com/joypixels/emoji-toolkit)を使うといいでしょう。

```txt
...
:muscle:	💪
:gift_heart:	💝
:upside_down_face:	🙃
...
```

ローマ字テーブルを利用しているため、[記事添付のツイート](https://twitter.com/p_ck_/status/838329944333676545)のように、 `:` を打ち終わると同時に絵文字が表示されるという滑らかな体験を得られます。通常のローマ字入力で考えれば <kbd>s</kbd><kbd>h</kbd><kbd>i</kbd> で「し」と入力できるのは当たり前ですが、これを絵文字入力に応用したという部分が先進的ですね。

しかし、この手法にも弱点があります。長いショートコードであっても補完候補が表示されないのです。つまり、例えば :white_sun_behind_cloud_with_rain: を入力するためには `:white_sun_behind_cloud_with_rain:` と誰の助けも得ずに入力しなければいけません。 `:muscle:` を `:mustle:` と打ち間違えてもダメです。もちろん、ローマ字入力がおぼつかない人はまず寿司打で練習するべきだし、 <kbd>s</kbd><kbd>h</kbd> と打つと「しゃ？し？しゅ？しぇ？しょ？」なんて候補が出るIMEは誰も使いたがりません。

さらに致命的な欠点があります。先ほど紹介した記事には、

> ローマ字テーブルをいじることが出来る IME であれば同様のことが可能だと思います。

という記載がありますが、残念ながらこの方法はATOKでは使えません。ローマ字テーブルの仕様の影響で、正常に絵文字が登録・出力できないのです。

まず、ローマ字は4文字以下で指定する必要があります。この制限でほとんどのショートコード、例えば `:zzz:` :arrow_right: :zzz: は5文字なので登録できません。

![ATOKローマ字テーブルに5文字のローマ字を登録できない様子](/images/input-method-emoji/register-roman.gif){width=620 height=460}

さらに、対応するかなはひらがな・英数字・一部の記号しか使えません[^kana]。絵文字はUTF-8のバイト数の半分の「？」に強制変換されます。

[^kana]: かなは6文字以内という制限もあります。

![ATOKローマ字テーブルに絵文字を登録できない様子](/images/input-method-emoji/register-emoji.gif){width=620 height=460}

例として、 :eye_in_speech_bubble: はUTF-8で `f0 9f 91 81 e2 80 8d f0 9f 97 a8` の11バイトになるため、5つの「？」に変換されてしまいました。これは単なる表示の問題ではなく、 <kbd>:</kbd><kbd>a</kbd><kbd>a</kbd><kbd>:</kbd> という入力は「？？？？？」になってしまいます。

![ATOKローマ字テーブルで絵文字を入力できない様子](/images/input-method-emoji/input-emoji.gif){width=620 height=460}

これらは、絵文字入力のためにローマ字テーブルをハックする立場からは厳しい制限に見えますが、通常のローマ字入力では不自由しないレベルの仕様です。むしろ、Google 日本語入力がゆるすぎるのかもしれません。とはいえ、これまでそのゆるさに頼ってローマ字テーブルをハックしてきたため、IMEの切り替えに伴って新たな絵文字入力手法の導入を迫られました。

## Windows固有の絵文字パレット

- 環境: ATOK（ただしIME非依存） + Windows

Windows 10/11なら、 <kbd>Win</kbd> + <kbd>.</kbd> で[絵文字キーボード](https://support.microsoft.com/en-us/windows/windows-keyboard-tips-and-tricks-588e0b72-0fff-6d3f-aeee-6e5116097942)を起動できます。使っているIMEとは関係のないWindows固有の機能であり、絵文字が縦横に並んだパレットから好きなものをクリックして入力できます[^win11emoji]。絵文字だけではなく、通貨記号や数学記号なども同様の手触りで入力可能です。このような絵文字・記号パレットは、スマートフォン向けのIMEでは一般的ですね。

[^win11emoji]: Windows 11 + Microsoft IMEなら絵文字を検索できるようですが、テストしていません。

![Windows固有の絵文字パレットで入力している様子](/images/input-method-emoji/win-dot-emoji.gif){width=620 height=460}

この方法は、Windowsを使っていれば特別な設定なしで呼び出せるので、とっさに絵文字や記号を入力したいときに役立ちます。しかし、主にフリック入力を使うスマートフォンとは異なり、キーボード入力が主体のWindows PCは絵文字パレットとの相性が悪いです。絵文字パレットを呼び出したらキーボードから手を離して、無駄なスクロール[^manyscroll]とクリックを繰り返して、終わったらまたキーボードに戻るという非効率な手順を踏む必要があります。

また、少なくともATOKを使っている場合は絵文字を検索する手段がないため、ショートコードで絞り込むこともできません。検索性の悪さはローマ字テーブルのハックと同様ですが、 `:+1:` のようなよく使う短い絵文字さえショートコードで呼び出せないので、機能性はさらに低下してしまいました。

[^manyscroll]: お目当ての絵文字を見逃して通り過ぎてしまうことがしばしば。

できるだけキーボードから離れずに、より効率的に絵文字を入力できる手段はないのでしょうか？　その答えの一つが、次に示すクイックランチャーと絵文字検索プラグインの組み合わせです。

## PowerToys Run + GEmojiSharp

- 環境: ATOK（ただしIME非依存） + Windows

[PowerToys Run](https://learn.microsoft.com/ja-jp/windows/powertoys/run)は、[Microsoft PowerToys](https://learn.microsoft.com/ja-jp/windows/powertoys/)の一機能として提供されている高機能のクイックランチャーです。 <kbd>Alt</kbd> + <kbd>Space</kbd>[^powertoysrun] を押してディスプレイの真ん中に現れるランチャーで、ファイルやWebの検索、四則演算や単位変換などを実行できます。

[^powertoysrun]: このショートカットキーはカスタマイズ可能で、私は <kbd>Win</kbd> + <kbd>Space</kbd> にしています。

各機能は個別に有効化可能なプラグインとして提供されていて、 `123+456` のようなコマンドをそのまま入力すれば、主要なプラグインからまとめて候補を表示できます。または、 `=2^32` のように「直接アクティブ化コマンド」と呼ばれる固有のプレフィックス（電卓機能は `=` ）を付与すれば、個別のプラグインを指定して呼び出せます。

![PowerToys Runの使用例](/images/input-method-emoji/powertoys-run-sample.gif){width=700 height=330}

そして、このランチャーで役立つのが[GEmojiSharp](https://github.com/hlaueriksson/GEmojiSharp)という絵文字とショートコードの相互変換を行う.NET向けのライブラリです。コマンドラインツールとPowerToys Run用のプラグインが提供されており、これを使うとPowerToys Runを通じてショートコードの一部から絵文字をコピーできるようになります。

![GEmojiSharpプラグインで絵文字を検索している様子](/images/input-method-emoji/powertoys-run-gemoji-sharp.gif){width=700 height=500}

私がこのプラグインを導入した当初は動作が不安定だった記憶があり、絵文字をコピーするとたまに不穏なエラーダイアログが出たりしたのですが、現バージョンはたぶん安定して動きそうでした。先述した絵文字パレットと比較するとインストールが必要な分少し面倒なのですが、PowerToys Run以外にも便利なツールがたくさん揃っているので、PowerToysのついでに導入するくらいの比重で試してみるのがおすすめです。

GEmojiSharpプラグインを他の手法と比較した際の大きな利点の1つは、ショートコードを補完できることです。利用例で示したとおり、 `:ups` まで入力した時点で `:upside_down_face:` :upside_down_face: という候補を表示できます。ただし、ここでの検索対象は絵文字の説明も含んでいるので、短いショートコード（例:  `ng` :arrow_right: :ng: ）や一般的な語のショートコード（ 例: `flag` :arrow_right: :waving_white_flag: ）では候補を絞りきれないケースがあるのが少し不便です。

![GEmojiSharpプラグインで短い語や一般名詞を上手く検索できない様子](/images/input-method-emoji/gemojisharp-short-common-code.gif){width=700 height=410}

このプラグインは単なる補完だけではなく、 :fist: :rage: :anger: :point_up: :wink: :sparkles: :muscle: :triumph: :muscle: のような連続した異なる絵文字を入力する際にも役立ちます。公式の[README](https://github.com/hlaueriksson/GEmojiSharp#gemojisharppowertoysrun)のような *ショートコード自然言語交じり文* を使えば、視線移動を減らせる上に、ランチャー内でショートコードと絵文字を透過的に扱えるという2つ目の利点を生かせます。ただし、GitHubやSlackの入力コンポーネントとは異なり、先頭以外のショートコードは部分一致で検索できないことに注意が必要です。

![ショートコード自然言語交じり文で後半の絵文字を検索できない様子](/images/input-method-emoji/gemojisharp-complex-sentence.gif){width=700 height=410}

まとめると、複雑な絵文字については1文字ずつ検索機能を活用して、簡単な絵文字なら複数個を連続して素早く入力するという両面の使い方ができそうです。まだショートコードを断片的にしか覚えていなくても、将来たくさんの絵文字を補完なしで使えるようになっても、あなたに寄り添ってくれるというわけですね。

## ユーザー辞書

- 環境: ATOK + Windows

最後に、現時点で私が採用しているのが、ATOKのユーザー辞書にショートコードと絵文字を登録するという手法です。もともと `いいね` :arrow_right: :+1: とか `はーと` :arrow_right: :heart: 程度の頻出絵文字は変換できますが、これをショートコード全体に広げてもっと使いやすくします。

ローマ字テーブルのハックとは違ってIMEの変換機能を素直に活かした手法なので、ATOK以外のIMEでも、もちろんWindows以外でも使えるのは一定の強みがあるかなと思います。

記事執筆にあたって久しぶりに使ったGEmojiSharpプラグインが割と安定していたので、Windowsを使っている限りはどちらを選んでもよいでしょう。ランチャーで絵文字を探す独特な使い心地が肌に合わないとか、入力中のカーソルからランチャーに視線を移動するのが煩わしいと感じる場合は、依然としてこの手法がおすすめです。

ユーザー辞書にショートコードと絵文字の対応をインポートするためのファイルを生成する手順は、ローマ字テーブルのハックのものと同様です。具体的な処理については、ショートコードと絵文字のエンティティを紐付けるJSONファイルをATOK向けの単語ファイルに変換する[emoji_atokdict_generator.py](https://gist.github.com/amane-katagiri/e10f135da064d6d6fd772e9c58b22ec3#file-emoji_atokdict_generator-py)を読んでみてください。

このスクリプトを実行すると、以下のような単語ファイルが得られます。

```txt
!!ATOK_TANGO_TEXT_HEADER_1

...
Muscle	💪	名詞*
GiftHeart	💝	名詞*
UpsideDownFace	🙃	名詞*
WomenHoldingHandsMediumDarkSkinT	👭🏾	名詞*
...
```

[emojidict.txt](https://gist.github.com/amane-katagiri/e10f135da064d6d6fd772e9c58b22ec3#file-emojidict-txt)

なお、ATOK向けの単語ファイルはBOM付きUTF-16 LE + CRLFでエンコードしなければなりません。スクリプトからの出力はUTF-8なので、実行する際はドキュメントに記載の通り `nkf -w16L` などで変換を挟んでください。

さて、単語ファイルを見ると2つの違和感に気付きます。まず、これまで見てきた `:upside_down_face:` のようにスネークケースを `:` で挟んだショートコードではなく、 `:` のないパスカルケースになっています。次に、一部のショートコードが単語の途中で打ち切られています。

これらは、ATOKの入力動作やユーザー辞書の制限に合わせて快適な絵文字入力を実現するための工夫です。

まず、普通にショートコードを入力すると <kbd>:</kbd><kbd>r</kbd><kbd>a</kbd><kbd>i</kbd><kbd>n</kbd><kbd>b</kbd><kbd>o</kbd><kbd>w</kbd><kbd>_</kbd><kbd>f</kbd><kbd>l</kbd><kbd>a</kbd><kbd>g</kbd><kbd>:</kbd> :arrow_right: `：らいんぼｗ＿ｆぁｇ：` のようにひらがなと全角アルファベットが混ざった表記になります。 `:rainbow_flag:` というショートコードから一部がローマ字になった文字列を得る作業は煩雑ですし、その場で自分が何を入力したか確認したり、途中で訂正するのも困難です。

そのため、全てがアルファベットの状態で変換を開始できるように、各単語の先頭を大文字で入力します。すると、 <kbd>:</kbd><kbd>R</kbd><kbd>a</kbd><kbd>i</kbd><kbd>n</kbd><kbd>b</kbd><kbd>o</kbd><kbd>w</kbd><kbd>_</kbd><kbd>F</kbd><kbd>l</kbd><kbd>a</kbd><kbd>g</kbd><kbd>:</kbd> :arrow_right: `：Rainbow_Flag:` という表記になり、 `:rainbow_flag:` からの変換も単純になります。

そして、ATOKのユーザー辞書はローマ字テーブルよりゆるいものの、読みが32文字以内という制限があるのでさらに短くします。ショートコードであることを識別する `:` は変換を挟むなら不要ですし、先頭が大文字なら単語を区切る `_` も余計です。これらを削ると、単語ファイルに示した <kbd>R</kbd><kbd>a</kbd><kbd>i</kbd><kbd>n</kbd><kbd>b</kbd><kbd>o</kbd><kbd>w</kbd><kbd>F</kbd><kbd>l</kbd><kbd>a</kbd><kbd>g</kbd> :arrow_right: `RainbowFlag` のようなパスカルケースが得られます。入力の負担も減りますね。

最終処理として、この時点で32文字を超えているショートコードは32文字になるように切り詰めます[^longshortcode]。切り詰めることで前半が同じ読みになってしまう場合は、そのまま複数の候補として登録します。おそらくこんなに長いショートコードをそらで打ち込む場面は来ないと思うので、簡単な対応にとどめました。

[^longshortcode]: `:couple_with_heart_medium_dark_skin_tone:` :couple_with_heart_medium_dark_skin_tone: のような肌の色を指定するタイプの絵文字が32文字を超えがちです。

これらをユーザー辞書に登録すれば、パスカルケースのショートコードを入力して変換すると絵文字が候補に表示されるようになります。ローマ字テーブルのハックと比較すると、入力後に変換キーを押すのが冗長かもしれません。しかし、元のショートコードから `:` と `_` を少なくとも2つは削っているため、キーストローク数は同じかむしろ減少します[^keystroke]。また、何度か同じショートコードを変換すると前半の数文字で候補に出るので、ある種の補完機能としても役立ちます。

[^keystroke]: 例えば <kbd>:</kbd><kbd>u</kbd><kbd>p</kbd><kbd>s</kbd><kbd>i</kbd><kbd>d</kbd><kbd>e</kbd><kbd>\_</kbd><kbd>d</kbd><kbd>o</kbd><kbd>w</kbd><kbd>n</kbd><kbd>\_</kbd><kbd>f</kbd><kbd>a</kbd><kbd>c</kbd><kbd>e</kbd><kbd>:</kbd> の18回に対し、 <kbd>U</kbd><kbd>p</kbd><kbd>s</kbd><kbd>i</kbd><kbd>d</kbd><kbd>e</kbd><kbd>D</kbd><kbd>o</kbd><kbd>w</kbd><kbd>n</kbd><kbd>F</kbd><kbd>a</kbd><kbd>c</kbd><kbd>e</kbd><kbd>変換</kbd><kbd>Enter</kbd> の16回で入力できます。

![UpsideDownFace,+1,Tada,GiftHeartを入力している様子](/images/input-method-emoji/input-atok-emoji.gif){width=450 height=210}

もし `:` 付きの方がしっくりくるなら `:GiftHeart:` のような `:` を含む読みにしてもいいですし、通常の英数字の入力と区別したければスクリーミングスネークケース `GIFT_HEART` にしてもいいでしょう。スクリプトは好みに応じていつでもカスタマイズ可能です。

同様の手順で単語ファイルを生成すればどのような環境でも利用できると思いますが、ここではATOKでのインポート手順について紹介しておきます。

まず、単語ファイルをユーザー辞書にインポートしてください。定期的な再インポートや入力スタイルの変更をやりやすくするために、通常の登録単語と区別できる絵文字用の新しい辞書を作成するのをおすすめします。この辞書の作成場所は `%APPDATA%\Justsystem\ATOK\DIC` になるので、後続の辞書セットへの追加時はここを参照します。

![ATOK辞書ユーティリティでユーザー辞書を作成して単語ファイルをインポートしている様子](/images/input-method-emoji/import-emojidic.gif){width=670 height=500}

インポートが終わったら、通常の変換機能（変換キーまたはスペースキー）から呼び出せる標準辞書セットにこの絵文字辞書を追加します。変換キーではなくF5キーなどで絵文字変換を呼び出したい場合は、オプション辞書セットなどの別の辞書セットに追加してください。

![ATOKの標準辞書セットに絵文字用ユーザー辞書を追加している様子](/images/input-method-emoji/register-emojidic.gif){width=640 height=480}

# まとめ

この記事では、以下の絵文字入力方法について紹介しました。

- [IMEのローマ字テーブル](#ime)
    - カーソルから目を離さずキーボードのみで入力できます。
    - Google 日本語入力を使っていれば設定しておいて損はないです。ATOKでは使えません。
    - 補完機能がないので、ショートコードを暗記できる範囲のものしか入力できません。
- [Windows固有の絵文字パレット](#windows)
    - カーソルから目を離してマウスで操作する必要があります。
    - Windowsなら特別な設定をせずに <kbd>Win</kbd> + <kbd>.</kbd> ですぐに呼び出せます。
    - ショートコードで絵文字を検索することはできません。
- [PowerToys Run + GEmojiSharp](#powertoys-run-gemojisharp)
    - キーボードのみで入力できますが、ランチャーに視線を移す必要があります。
    - Windowsで[Microsoft PowerToys](https://learn.microsoft.com/ja-jp/windows/powertoys/)と[GEmojiSharp](https://github.com/hlaueriksson/GEmojiSharp)をインストールすると利用できます。
    - ショートコードで絵文字を部分一致検索できますが、一部動作に癖があります。
- [ユーザー辞書](#_3)
    - カーソルから目を離さずキーボードのみで入力できます。
    - 多くのIMEで汎用的に使える方法で、カスタマイズが簡単です。
    - よく使う絵文字は推測候補に出るため、入力ストロークを短縮できます。

他にも最強の絵文字入力方法があれば、ぜひコメントから教えてください。本文に追記するかもしれません。
