• 絵文字でGo

絵文字と聞くと筆者などは「女子大生のiモードメール」のようなものを思い浮かべてしまうが、いまや、多くのテキスト系コミュニケーションで絵文字は使われており、それが普通なのだと感じている人も少なくないだろう。

絵文字は、最近では、Emojiとなり、Unicodeにも取り込まれている立派な「文字」である。このため、Unicodeを正しく扱えるプログラムなら、絵文字を混ぜたテキストを扱うことができる。UnicodeのEmojiは、フォントにより見た目は違うものの、定義は文字で行われているため、どの環境でもほぼ同じ意味を伝えることができる。

ただ、絵文字を正しく扱うには、言語処理系だけでなく、開発ツール、ライブラリ、実行環境などがそれぞれ正しく絵文字を扱う必要がある。ところが、絵文字は、現在でもまだ進化中で、Unicodeのバージョン(ほぼ毎年更新されている)が上がると新しい絵文字が追加されている。このため、ソフトウェアの設計、開発時期により、対応するUnicodeバージョンが異なることがあり、それが原因で正しく絵文字が表示できないことがある。

絵文字を使う

絵文字の入力は、IMEから変換機能で入力が可能だが意外に面倒だ。タッチ対応のシステムなら、タッチキーボード上のボタンを使うが、たいていは絵文字専用の入力パネルが用意されている。Windows 10/11なら「Windowsロゴ+ピリオド」で絵文字入力パネルが開く。Chromebookならば、「検索+Shift+スペース」だ。Androidでは、GBoardの事前設定が必要だが、接続した物理キーボードのAltキーで絵文字入力パネルを開くことができる(設定→システム→言語と入力→画面キーボード→GBoard→詳細設定→物理キーボードで絵文字を表示)。

なお、Unicodeでは、絵文字のカテゴリや順番なども定めている。このため、絵文字パネルの並びは同じようなものになる。これに関しては、以下のページに説明がある。また、ここからコンピューターに読み込める定義ファイルも入手可能だ。

Emoji Ordering, v13.1
https://www.unicode.org/emoji/charts-13.1/emoji-ordering.html

Emojiは、Unicodeで決められるため、Unicodeのバージョンにより、収録されている絵文字に違いがある。最新のUnicode Ver.13では、絵文字に「窓」の絵やエレベーターのピクトグラムが追加された。WindowsやChromeOSのように1社のみが提供するプラットフォームでは、OSのバージョンごとに対応しているUnicodeバージョンがある。たとえば、Windows 10は、Ver.1903(19H1)でUnicode Ver.12に対応したが、Windows 11はVer.13ベースになる(これでようやく「Window」を絵文字で表せる)。Androidは、Ver.11(Android R)でUnicode 13対応を行った(Android Ver.12まではUnicode Ver.11対応だった)。

Emojiは他の文字同様、フォントで表示されるため、プラットフォームのどこのかに「絵文字フォント」がある。たとえば、Windowsは、Segoe UI EmojiというフォントがC:\Windows\Fonts\SEGUIEMJ.TTFというファイルとしてインストールされている。ChromebookやAndroidは、Google Notoフォントを使っているようだ。プラットフォームの絵文字対応は、このフォントファイルで大部分が決まる。

文字を表示するには、フォントが使われるが、たいていの場合、絵文字のフォントファイルは1つだけ。絵文字には、明朝もゴシックもない。どうなっているのかというと、普通の文字フォントでは、絵文字部分のコードに相当する文字(グリフ)は入っておらず、これをシステムが検出して、他のフォントファイルに切り替える。このため、どのフォントを使っていても、絵文字を混在させられるわけだ。しかし、多くのシステムでは、絵文字のフォントは1つだけ。なので、絵文字フォントファイルにより、デザインに違いがある。たとえば、「電話」の絵文字には、古いダイヤル式を絵柄にしたものと、ボタン式電話の絵柄のものがある。ただし、FacebookやTwitterなどのSNSサービスでは、環境に依存せず、どこでも表示を同じにするために独自の絵文字フォントを使っていることがある。

プログラムで絵文字を使う

ITやコンピュータ関連の用語には、「ホームページ」や「ホームディレクトリ」など、「ホーム」という言葉を使った用語が多く、「本来の場所」、「初期位置」などの意味で使われている。このような場合「家(ホーム)」の絵文字を使うこともできる。「ホーム」は、日本語では3文字、英語でも4文字となるが、「家」の絵文字はどの言語環境でも1文字である。データ上は、複数の文字コードを組み合わせて1つの絵文字とすることもあるが、少なくとも表示上は1文字である。いちいち、絵を描かなくていいのがラクな点。HTMLならテキストの間に画像を挟み込むことは難しくはないが、絵を描くのは面倒(それに絵心も……)。さらに絵文字のように大量の画像を管理するのもラクではない。

多くのプラットフォームで、絵文字は、カラーフォントで表示できる。アプリケーション開発のフレームワークによっては、まだモノクロの絵文字しか扱えない場合があるが、カラー表示なら、情報量も多く、意味を理解しやすくなる。Windowsでは、UWPはカラー絵文字を簡単に扱えるが、Win32(デスクトップ環境)のWPFでは、ちょっと工夫しないとモノクロの絵文字しか表示できない。これは、テキストの描画方法が古いままだからだ。しかし、Webブラウザはカラー絵文字を簡単に表示できる。

小さな領域に情報を詰め込みたい場合、絵文字を使うことができる(絵文字にはソフトウェアのボタンに使えそうな絵もある)。イメージ的には、「郵便番号」と書かずに「〒」を使うようなものだ。あるいは、8 bit CPUの頃のBASICを搭載した「マイコン」にあった「グラフィックキャラクタ」を思い出すかもしれない。

とりあえず、タイトルにあるようにGo言語で絵文字を扱ってみた(写真01)。もっとも、単に文字列に絵文字を入れるだけ。Windows標準のコンソールでは正しく表示できないが、Windows Terminalを使うと絵文字入りテキストを表示できる。

  • 写真01: UTF-8などでソースコードが記述できる言語ならなんでもいいのだが、タイトルにあわせてGo言語で絵文字を使ったプログラムを書いてみた。絵文字を使うことで、意味を1文字に凝縮して表示させることができる。Windows Terminalを使い、コードページを65001(chcp.exe 65001)に切り替えるのがポイント

変数名にユニコード文字が利用できるプログラミング言語なら、変数名に絵文字を使うこともできる。C++とかJavaScriptが変数名にユニコード文字を許している。ただし、ASCIIのアルファベットと数字、若干の記号文字のみという言語もまだいっぱいある。残念ながらGo言語は、絵文字を変数名に使うことはできない。

Windowsに標準搭載されているWindows PowerShellは、変数名にユニコード文字が利用できる。ただ、Windows PowerShellは、内部コードが16 bitの文字コードなので、絵文字はサロゲートペアによる表現となり、入力行解析のときに1文字なのに1文字と認識されないためエラーになる。このため、全体を波括弧「{}」でくくり「${絵文字}」みたいにする必要がある(写真02)。もう1つ、コンソール出力の文字エンコーディングがデフォルトではシフトJISになっているので、これをUTF-8に変更する必要がある。

  • 写真02: Windows PowerShellは、変数名にユニコード文字が使える。ただし、絵文字の場合には、サロゲートペアによる表現となるため、名前の部分を波括弧でくくる必要がある。また、コンソールの文字エンコーディングをUTF-8に切り替えておく必要がある

システム管理などでコマンドラインの重要性も見なおされているが、コンソールで絵文字を使うと、少し面白いことができそうだ。