GSM-7 エンコーディング
SMS で使われる 7 ビット文字エンコーディング。1 メッセージ 160 文字を格納でき、英数字と基本的な記号に対応する。
GSM-7 は、GSM (Global System for Mobile Communications) 規格で定義された 7 ビットの文字エンコーディングです。SMS (ショートメッセージサービス) のデフォルトエンコーディングとして使われ、1 メッセージあたり 160 文字を格納できます。基本の文字表は 128 文字ですが、ASCII と同じ並びではありません。£ や ¤、Ä や ö といった西欧言語の文字、Δ や Ω などのギリシャ大文字が含まれる一方、ASCII にある [ ] { } \ | ~ ^ とユーロ記号 (€) は基本表の外に置かれています。
SMS の 1 メッセージは 140 バイト (1,120 ビット) に制限されています。GSM-7 は 1 文字 7 ビットなので、1,120 / 7 = 160 文字を格納できます。一方、日本語や絵文字を含むメッセージは UCS-2 (16 ビット) エンコーディングに切り替わり、1,120 / 16 = 70 文字に制限が変わります。
拡張表にある文字は、切り替えを示す符号を前に付けて送るため 1 文字で 2 文字分を消費します。JSON の例を書くために波括弧を並べたり、価格表記にユーロ記号を使ったりすると、見た目の文字数と請求上の文字数がずれます。160 文字ちょうどに収めたつもりのメッセージが 2 通に分割される事故は、この 2 文字分の消費を数え忘れることで起こります。
UCS-2 への切り替えは自動的に行われるため、英語のメッセージに絵文字を 1 つ追加するだけで、文字数制限が 160 文字から 70 文字に激減します。90 文字分の容量を絵文字 1 つのために失うことになり、SMS の料金にも影響します。長文の SMS は複数メッセージに分割されて送信され、それぞれに課金されるためです。分割時は連結用の制御情報 6 バイトが本文領域を削るので、1 通あたりは GSM-7 で 153 文字、UCS-2 では残る 134 バイトを 2 バイト文字で割った 67 文字になります。3 通に分けて 459 文字送るより、160 文字に収めて 1 通で済ませたほうが 3 分の 1 の費用で届きます。
意図せず UCS-2 に落ちる原因は、日本語や絵文字だけではなく、見落としやすい記号の混入にもあります。文書作成ソフトが自動変換した右シングルクォート (’) や全角の括弧、波ダッシュ (〜) は基本表にも拡張表にも無いため、英文のつもりのメッセージでも上限が 70 文字に変わります。送信前に GSM-7 の表に無い文字が混ざっていないかを機械的に検査し、混入していれば半角の直線的な記号 (') に置き換えるのが確実です。
現代のメッセージングアプリ (LINE、WhatsApp、iMessage) はインターネット経由で通信するため、GSM-7 の制約を受けません。しかし、SMS は電話番号だけで送れる普遍性から、二要素認証の確認コードや緊急通知など、依然として重要な役割を果たしています。こうした用途では、文面を半角英数と基本表の記号だけで組み、1 通 (英数字なら 160 文字・分割前提なら 153 文字) に収める設計が定石です。