自動化システムの構築や顧客への通知送信を行う際、多くのビジネスオーナーや開発者は、月々のSMS請求額が予想の2倍も高くなっていることに驚かされます。この包括的なガイドでは、SMS送信時に特殊文字が消費する文字数の一覧表を提供し、隠れたエンコードの切り替えがメッセージングコストをどのように劇的に引き上げるかを分かりやすく解説します。

特殊文字がSMSの長さとコストを変化させる理由

通信規格において、テキストメッセージは入力した生の単語数ではなく、"セグメント"単位で課金されます。標準的なSMSセグメントは GSM-7 文字セットを使用してエンコードされ、1メッセージあたり最大160文字まで送信できます。しかし、絵文字、キリル文字、あるいはMicrosoft Wordからコピーした装飾的な"スマートクオート(引用符)"など、この標準セット以外の文字を1文字でも含めると、メッセージ全体のエンコードが UCS-2(Unicode)に切り替わります。

UCS-2エンコードにおいて、「特殊文字や絵文字が含まれていても、SMSメッセージは160文字に制限される」というのはよくある誤解です。実際には、GSM以外の文字が1文字でも検出されると、1セグメントあたりの最大文字数制限は160文字からわずか70文字へと瞬時に低下します。もしメッセージが71文字で、その中に絵文字が1つ含まれている場合、Twilio や Plivo などの従来のAPIプロバイダーでは、メッセージが分割され、2つの独立したSMSセグメントとして課金されます。

どのような特殊文字がメッセージに影響を与えるかを理解することは、運用コストを低く抑えるために極めて重要です。特に、クリニック、サロン、修理店などの地域密着型のサービスビジネスを運営し、顧客に予約のリマインダーを送信している場合はなおさらです。

GSM-7とUCS-2エンコードの違いについて

GSM-7 は、SMS専用に設計された7ビットの文字エンコード規格です。ほとんどのラテン文字、数字、および基本的な記号が含まれています。UCS-2 は16ビットのエンコード規格であり、絵文字を含むほぼすべての言語の文字を表現できますが、1文字あたり2倍のデータ量を必要とします。このデータオーバーヘッドがあるため、UCS-2がトリガーされると、キャリアネットワークはセグメント容量を70文字に引き下げるのです。

SMS特殊文字マッピング一覧表

以下は、SMS送信時に特殊文字が消費する文字数の一覧表です。この表では、標準の GSM-7 文字、GSM-7 拡張文字(160文字制限の中で2文字分としてカウントされるもの)、および厳格な70文字制限を強制する UCS-2 文字の概要を示しています。

文字カテゴリ文字の例1文字あたりのビット数SMS内での文字カウント(重み)最大セグメント制限
GSM-7 基本A-Z, a-z, 0-9, スペース, 簡単な記号 (., !, ?, @, $, など)7ビット1文字160文字
GSM-7 拡張^, {, }, [, ], ~, |, \, €14ビット2文字160文字(各拡張文字は2文字としてカウント)
UCS-2 (Unicode)á, í, ó, ñ, ’ (スマートクオート), 絵文字 (😀), キリル文字, アラビア文字16ビットメッセージ全体をUnicodeに強制70文字

表に示されているように、波括弧 "{" やバックスラッシュ "\" などの GSM-7 拡張文字を使用してもUnicodeは強制されませんが、160文字制限に対して2文字分としてカウントされます。しかし、"á"(スペイン語の sms y caracteres especiales 設定でよく使用される)や、曲がったアポストロフィ "’" などの非GSM文字を使用すると、メッセージのセグメント制限は即座に70文字に減少します。

特殊文字がSMSコストに与える影響

los caracteres especiales que impacto tienen en el coste de los sms(特殊文字がSMSのコストに与える影響)を理解するために、具体的な例を見てみましょう。あなたが歯科医院を経営しており、次のような予約確認のリマインダーを送信するとします。

"Hi John, your appointment is scheduled for tomorrow at 3:00 PM. Please reply to confirm or call us if you need to reschedule! Él"

このメッセージの長さは123文字です。アクセント付きの "É" の代わりに標準の "E" を使用した場合、メッセージは GSM-7 で送信されます。これは160文字の制限内に余裕で収まるため、料金は正確に1SMSセグメント分となります。

しかし、アクセント付きの "É" が含まれているため、メッセージは強制的に UCS-2 になります。これによりセグメント制限は70文字になります。123文字のメッセージは2つのセグメントに分割され(セグメンテーションヘッダーの影響で、最初のセグメントは67文字、2番目のセグメントは56文字になります)、従来のAPIゲートウェイは、1通ではなく2通分のSMS料金を請求します。

従来のプロバイダーを使用している場合、このセグメンテーションによって月々の請求額が2倍や3倍に跳ね上がることがあります。そのため、多くの企業は任意のセグメントベースの追加料金を避けるために、Twilioの代替サービスを探したり、最も安いSMS APIのガイドを参考にしたりしています。

SMSで特殊文字を避けるにはどうすればよいですか?

メッセージを160文字の制限内に収め、予期しないコストを回避したい場合は、SMSのペイロードを積極的にクレンジング(サニタイズ)する必要があります。以下は、SMSで特殊文字を避ける方法に関する実践的な戦略です。

  1. コピー&ペーストしたテキストをクレンジングする: 多くのCRMテンプレートには「スマート」な記号が含まれています。たとえば、リッチテキストエディタからコピーしたアポストロフィ(’)やカンマは、正常な配信を妨げたり、Unicodeをトリガーしたりする可能性があります。現実の例として、一部の企業の社内システムでは、アドバイザーに対して次のような簡単な警告を出しています。"outbound sms special characters please be aware that any outbound sms sent must be 250 characters or fewer. if your message has been copied & pasted from a saved template and contains a comma (,) or apostrophe ('), please remove the special character and then re-enter it before sending"(送信SMSの特殊文字について:送信するすべてのSMSは250文字以下である必要があります。保存されたテンプレートからコピー&ペーストしたメッセージにカンマ(,)やアポストロフィ(')が含まれている場合は、送信前にその特殊文字を削除し、再入力してください)。スマートクオートを標準のストレートクオート (') に置き換えることで、GSM-7への準拠が保証されます。
  2. プログラムで非GSM文字を置き換える: システムが動的にSMSを生成する場合は、文字変換(音訳)関数を実装して、"á" を "a" に、"é" を "e" に、"“" を """ に置き換えるようにします。
  3. プラットフォーム固有の制限に対処する: エンタープライズ向けのローコードプラットフォームで開発している場合は、エンコードの処理方法に注意してください。たとえば、special characters in gsm outsystems(OutSystemsにおけるGSM特殊文字)の連携などでは、JSONシリアライズの過程で、テキスト変数が標準の記号を自動的にUnicode同等物に変換してしまうことがあります。

SMSテキストをクレンジングするPythonコードスニペット

以下は、SMSが認識しない特殊文字や、高価なUCS-2エンコードを強制してしまう文字を除去・置換するためのシンプルなPython関数です。

import unicodedata

def sanitize_for_gsm7(text):
    # Map common smart punctuation to GSM-7 equivalents
    replacements = {
        '\u2018': "'", '\u2019': "'", # Smart single quotes
        '\u201c': '"', '\u201d': '"', # Smart double quotes
        '\u2013': '-', '\u2014': '-', # En and em dashes
        '\u20ac': 'EUR'               # Replace Euro sign if needed
    }
    for unicode_char, gsm_char in replacements.items():
        text = text.replace(unicode_char, gsm_char)
    
    # Normalize accents (e.g., é to e)
    normalized = unicodedata.normalize('NFD', text)
    gsm7_text = "".join([c for c in normalized if not unicodedata.combining(c)])
    return gsm7_text

message = "Hello! Your appointment is confirmed for tomorrow é."
print(sanitize_for_gsm7(message))
# Output: "Hello! Your appointment is confirmed for tomorrow e."

MySMSGateでエンコードの不安を解消

地域サービス企業、学校、クリニックにとって、文字エンコードやセグメント制限、複雑な課金体系について心配することは、不必要な悩みの種です。ここで、従来の SMSゲートウェイとSMS APIのどちらかを選択することが重要になってきます。

MySMSGate はこの問題を完全に解決します。厳格なセグメント倍数価格を設定している高価なキャリアネットワークを介してメッセージをルーティングする代わりに、MySMSGate はあなた自身の Android スマートフォンとSIMカードをSMSゲートウェイに変換します。

MySMSGate がコストを意識する企業にとってどのように革新的なのか、以下にご紹介します。

  • 一律料金プラン: メッセージの長さ、文字エンコード、セグメントに関係なく、送信メッセージ1通あたり一律0.02ドルを課金します。絵文字やアクセント付き文字によって請求額が2倍になる心配はありません。
  • ご自身の番号を使用可能: メッセージは Android スマートフォンのSIMカードから直接送信されます。顧客にはおなじみの地元の携帯電話番号が表示されるため、返信率や開封率が向上します。
  • 複雑な登録は不要: Twilio などの従来のAPIに付随する、複雑な10DLC登録やキャリアの承認、月々のブランド手数料を回避できます。
  • デュアルSIMおよび複数デバイスのサポート: 単一のダッシュボードから複数のスマートフォンとSIMカードを管理し、顧客との会話ごとに送信元の回線を正確に選択できます。

よくある質問

SMSの文字エンコード、特殊文字、およびメッセージ制限に関する一般的な質問については、以下をご確認ください。

どの特殊文字を使用すると、SMSの制限が70文字に減少しますか?

標準の GSM-7 文字セットに含まれていない文字を使用すると、UCS-2 エンコードが強制され、制限が70文字に減少します。これには、絵文字、非ラテンアルファベット(キリル文字、アラビア文字、ギリシャ文字、ヘブライ文字)、および特定のアクセント付き文字や装飾された記号(曲がったスマートクオートなど)が含まれます。

スペースはSMSの文字数としてカウントされますか?

はい、GSM-7 と UCS-2 の両方のエンコード規格において、すべてのスペースが1文字としてカウントされます。

1通しか送信していないのに、なぜSMSプラットフォームから複数通分の料金を請求されるのですか?

メッセージが160文字(GSM-7の場合)または70文字(UCS-2の場合)を超えた場合、キャリアはメッセージを複数のセグメントに分割します。従来のAPIはセグメントごとに課金するため、1通の長いメッセージを送信しただけでも、基本料金の2倍や3倍のコストが簡単に発生してしまいます。

SMSメッセージに特殊文字が含まれているかどうかをテストするにはどうすればよいですか?

オンラインのSMSセグメント計算ツールを使用するか、バックエンドでシンプルなクレンジングスクリプトを実行して、APIプロバイダーに送信する前にテキストが UCS-2 Unicode エンコードをトリガーするかどうかを検出できます。