1通のSMSは、GSM-7エンコードで160文字、UCS-2エンコードで70文字です。 どちらのエンコーディングがキャリアによって選ばれるかは、メッセージの内容によって自動的に決まります。すべての文字がGSM-7のデフォルトアルファベットにあれば、160文字すべてが使えます。1文字でもその外にあれば、メッセージ全体がUCS-2に再エンコードされ、上限は70文字に落ちます。
160/70を超えると、メッセージは連結セグメントに分割されます。各セグメントは受信端末がメッセージを再構築できるよう6バイトのヘッダーを運びます。そのため、マルチセグメントSMSは1セグメントあたりGSM-7で153文字、UCS-2で67文字しか使えません。キャリアとSMS APIはメッセージ単位ではなくセグメント単位で課金するため、200文字の送信に絵文字1つを加えると、1セグメントが4セグメントに静かに変わってしまいます。
SMS文字数の概要表
| シナリオ | 上限 | 備考 |
|---|---|---|
| 単一SMS、GSM-7 | 160文字 | プレーンラテン文字、絵文字なし |
| 単一SMS、UCS-2 | 70文字 | GSM-7外の文字で強制 |
| 連結セグメントGSM-7 | 153文字 | UDH 6バイトが7文字を消費 |
| 連結セグメントUCS-2 | 67文字 | UDHが3文字を消費 |
| 絵文字 | UCS-2 2単位 | 全体をUCS-2に強制 |
| iMessage / RCS / WhatsApp | 20,000+文字 | SMSではない。別ルール |
日本語SMSの注意点
日本語(ひらがな・カタカナ・漢字)はすべてGSM-7アルファベット外のため、日本語SMSは常にUCS-2エンコーディングが使われます。つまり、日本語SMSの実質的な上限は1セグメントあたり70文字、連結セグメントでは67文字になります。
実用例:
- 70文字以内:1セグメントで送信
- 71〜134文字:2セグメント(67+67)
- 135〜201文字:3セグメント(67+67+67)
GSM-7エンコーディング:160文字の標準
GSM-7はGSM 03.38規格で定義されたデフォルトのSMSエンコーディングです。1文字あたり7ビットでパックされており、これにより160文字が1,120ビット(140バイト)のSMSペイロードに収まります。アルファベットには128の基本文字と10文字の拡張表があります。これら138文字以外はUCS-2への切り替えを強制します。
基本アルファベットは、アクセントなしのラテン文字(A-Z、a-z)、数字0-9、一般的な句読点、スペース、改行、リターン、ヨーロッパのアクセント付き文字の小さなセット、科学表記用のギリシャ大文字、いくつかの通貨・記号文字をカバーします。
UCS-2エンコーディング:70文字に強制される時
UCS-2は16ビット(2バイト)のUnicodeエンコーディングです。同じ140バイトのSMSペイロードに1セグメントあたり70 UCS-2コードユニット、連結後は67が入ります。キャリアは、メッセージ内の1文字でもGSM-7外にあるとUCS-2に切り替えます。部分的な変換はありません。1文字が全体の送信を反転させます。
絵文字の隠れたトラップ
ほとんどの絵文字はUCS-2でサロゲートペアとしてエンコードされ、各絵文字が70文字のうち2文字を消費します。スキントーン変種や複合絵文字(家族、国旗、職業)は4以上消費する可能性があります。
連結SMS:なぜセグメントが153/67文字なのか
メッセージが単一SMS上限を超えると、セグメントに分割され、各セグメントは別個のSMSとして無線で送信されます。受信側の電話が正しい順序で再結合できるよう、各セグメントは参照番号、合計セグメント数、そのセグメントの位置を含むUser Data Header(UDH)を運びます。
UDHは6バイト長です。GSM-7では7文字分のペイロードに相当し、セグメントあたりの容量を160から153文字に減らします。UCS-2では同じ6バイトが3 UCS-2コードユニットで、上限を70から67文字に下げます。
マルチセグメントSMSの実コスト
ほぼすべての商用SMS APIはメッセージ単位ではなくセグメント単位で課金します。料金計算は単純です:総コスト = メッセージあたりセグメント数 × 受信者数 × セグメント単価。高くつくのはエンコーディングのトラップです。スマートクォートで書かれたキャンペーンは、静かにセグメント数と請求額を倍増させます。
UCS-2を強制する一般的な文字
- スマートクォート(カールクォート): Word、Pages、macOSは'と"を自動的にカールバージョン(“ ” ‘ ’)に置換します。4つすべてがUCS-2を強制します。送信前にSMSコピーを常にプレーンテキストステップを通してください。
- エムダッシュとエンダッシュ: エムダッシュもエンダッシュもUCS-2を強制します。ASCIIハイフンを使うか、文を2つに分けてください。
- 三点リーダー文字: 単一文字の…はUCS-2です。3つのASCIIドット"..."はGSM-7で見た目も同じです。
- すべての絵文字: すべての絵文字がUCS-2を強制し、ほとんどが70文字のうち2文字を消費します。
- 非ラテン文字: キリル、ギリシャ小文字、アラビア、ヘブライ、タイ、デーバナーガリ、中国語、日本語、韓国語、すべてUCS-2です。
- GSM-7外のアクセント付き文字: 一般的なヨーロッパのアクセント付き文字のほとんどはGSM-7にありますが、多くはありません(Ş、Č、Ł、ě、特定形のøなど)。
A2P 10DLC:ビジネスSMSルール
A2P 10DLC(Application-to-Person、10桁ロングコード)は、企業がショートコードではなく通常の10桁電話番号からSMSを送信できる米国のフレームワークです。文字ルールは同じ160/70/153/67で、違いはコンプライアンス、スループット、価格です。
iMessage / RCS / WhatsApp:制限が適用されない場合
- iMessage: Appleのサービスはソフト制限が約20,000文字。GSM-7/UCS-2の区別なし、セグメント課金なし。
- RCS(Rich Communication Services): GSMA支援のSMS後継。固定文字制限なし(通常8,000〜20,000)。AndroidとiOS 18+で広くサポート。
- WhatsApp: 1メッセージ65,536文字、セグメンテーションなし、エンコーディングルールなし。
- Telegram、Signal、Messenger: 通常使用ではすべて事実上無制限(4,000〜20,000+文字/メッセージ)。
SMSコストを削減する実践的なヒント
- プレーンASCIIを使う。 送信前にスマートクォート、ファンシーダッシュ、三点リーダー文字を取り除きます。
- 絵文字はクリックを稼ぐ場合だけ。 すべての絵文字がUCS-2を強制し、最低2文字消費します。
- プロモーションSMSは160文字以下に。 最良のコスト最適化は1 GSM-7セグメントに収めることです。
- リンクを短縮。 UTMパラメータ付きのhttps URLは1つで70+文字を消費します。
- 送信前にカウント。 エンコーディングを検出してセグメントを表示するカウンターでキャンペーンを確認します。 文字数カウンター を使ってください。