すべての記事

テキストの反転:絵文字でなぜ壊れるのか

「テキストを反転する」のは一見、文字を逆順に並べ替えるだけの単純な処理に思えます。実際、現代の日本語テキストの大半はこの単純な処理でも問題なく反転できます。ただし、絵文字や一部の文字表現が混ざると話は変わってきます。

書記素クラスタとは

人が「1つの見た目の文字」として認識するものが、Unicode上は複数のコードポイントで構成されていることがあります。家族の絵文字(👨‍👩‍👧)は、実際にはゼロ幅接合子(ZWJ)で連結された複数の独立した絵文字です。このようなまとまりを書記素クラスタと呼びます。

濁点・半濁点という隠れた落とし穴

現代の日本語テキストでは「が」や「ぱ」は通常1つの結合済みコードポイントとして扱われますが、Unicodeには濁点(U+3099)・半濁点(U+309A)を基底のかな文字に後置する結合文字としての表現も存在します。この表現が使われたテキストをコードポイント単位で単純に反転すると、濁点が本来とは別のかな文字にくっついてしまい、「が」が意図しない文字に化けます。絵文字と同じく、これも書記素クラスタ単位で扱わなければならない例です。

正しい反転

正しい実装は、まず文字列を書記素クラスタ(結合文字や修飾子、接合子を考慮した単位)に分割し、そのクラスタ単位で順序を反転します。クラスタ内部の個々のコードポイントを反転してはいけません。

何に使えるか

  • 回文の検証や、テキストを「鏡写し」にする演出。
  • コード内のUnicode処理のバグを実演・診断する。
  • 絵文字を含むテキストを正しく反転する必要がある学習・娯楽用途。
ツールを試す