Unicode(ユニコード)が原因でシステムがSMSを複数に分割して送信してしまい、請求額が急増していることに気づいたなら、その対策は今すぐ解決すべき最優先事項でしょう。意図しないスマートクォート(スマート引用符)や絵文字が1つ入るだけで、標準的な低コストのテキストメッセージが即座に3つの課金セグメントに分割され、マーケティングや運用の予算を圧迫してしまいます。
ステップ1:UnicodeがSMSを複数セグメントに分割する理由を理解する
SMSゲートウェイが1つのメッセージを複数の課金セグメントに分割するのを防ぐには、まずSMSエンコーディングの背後にある技術的な仕組みを理解する必要があります。従来の電気通信ネットワークでは、テキストメッセージに主に2つのエンコーディング規格が使用されています。GSM-7 と UCS-2(Unicode)です。
標準のGSM-7エンコーディングでは、1つのSMSセグメントに最大160文字を含めることができます。この文字セットには、標準のラテン文字(A-Z、a-z)、数字(0-9)、およびいくつかの一般的な記号が含まれます。しかし、メッセージ内にこの基本セット以外の文字(スマートクォート「’」、アクセント付き文字「á, é, ö」、絵文字など)が1文字でも含まれると、メッセージ全体のエンコーディングが自動的にUCS-2に切り替わります。
メッセージがUCS-2 Unicodeエンコーディングに切り替わると、1セグメントあたりの文字数制限は160文字からわずか 70文字 に低下します。メッセージが140文字の場合、GSM-7であれば1つのセグメントに余裕で収まります。しかしUCS-2では、同じ140文字を送信するのに2つのセグメントが必要になります。Twilio、Vonage、MessageBirdなどの従来のAPIプロバイダーはセグメントごとに課金するため、1通のメッセージに対するコストが即座に2倍、3倍に膨れ上がります。
| エンコーディング規格 | 最大文字数(1セグメント) | 最大文字数(複数セグメント) | 主なトリガー文字 |
|---|---|---|---|
| GSM-7 | 160文字 | 1セグメントあたり153文字 | 標準的な英数字、基本的な記号 |
| UCS-2 (Unicode) | 70文字 | 1セグメントあたり67文字 | 絵文字、スマートクォート(“, ”)、非ラテンアルファベット、アクセント付き文字(é, ñ) |
この仕様こそが、アプリケーションがUnicodeによってSMSを複数に分割して送信してしまう原因です。これを解決するには、入力データを厳密にサニタイズ(クレンジング)するか、長文や現代的なテキストメッセージの送信に対してペナルティを課さない 低価格なSMS API へ移行する必要があります。
ステップ2:コード内でUnicode文字を削除または置換する
プログラム側でUnicodeによる分割を即座に防ぐ最も簡単な方法は、SMSゲートウェイに送信する前にメッセージのペイロードをサニタイズすることです。バックエンドにユーティリティ関数を作成し、GSM-7以外の文字を削除するか、最も近いGSM-7互換文字に置換します。
以下は、シンプルな正規表現パターンと文字列置換ルールを使用して、さまざまなプログラミング言語でこれを実装する方法です。
Pythonでの実装
Pythonでは、unicodedataモジュールを使用して文字列を正規化し、アクセントを削除してスマートクォートを標準的なストレートクォートに変換できます。
import unicodedata
import re
def clean_for_gsm7(text):
# Replace common smart quotes and dashes
replacements = {
u'\u201c': '"', u'\u201d': '"',
u'\u2018': "'", u'\u2019': "'",
u'\u2013': '-', u'\u2014': '-'
}
for unicode_char, gsm_char in replacements.items():
text = text.replace(unicode_char, gsm_char)
# Normalize and strip accents
normalized = unicodedata.normalize('NFKD', text)
ascii_text = normalized.encode('ascii', 'ignore').decode('utf-8')
# Remove any remaining non-GSM-7 characters
gsm7_regex = re.compile(r'[^
a-zA-Z0-9^{}\\[~]|€$@!"#%&'()*+,-./:;<=>?_]')
cleaned_text = gsm7_regex.sub('', ascii_text)
return cleaned_text
message = "Hello! Your appointment is scheduled for tomorrow at 3 PM. See you there! 😊"
print(clean_for_gsm7(message))
# Output: "Hello! Your appointment is scheduled for tomorrow at 3 PM. See you there! "
Node.js (JavaScript) での実装
JavaScript開発者の場合、正規表現を使用してGSM-7規格に準拠していない文字を削除する同様のアプローチを採用できます。
function sanitizeToGSM7(text) {
const smartReplacements = {
'[\u201c\u201d]': '"',
'[\u2018\u2019]': "'",
'\u2013': '-',
'\u2014': '-'
};
let cleaned = text;
for (const [pattern, replacement] of Object.entries(smartReplacements)) {
cleaned = cleaned.replace(new RegExp(pattern, 'g'), replacement);
}
// Remove accents
cleaned = cleaned.normalize('NFD').replace(/[\u0300-\u036f]/g, '');
// Keep only GSM-7 compatible characters
const gsm7Pattern = /[^
a-zA-Z0-9^{}\\[~]|€$@!"#%&'()*+,-.\/:;<=>?_]/g;
return cleaned.replace(gsm7Pattern, '');
}
const rawMessage = "Your order is ready for pickup! 🚗";
console.log(sanitizeToGSM7(rawMessage));
// Output: "Your order is ready for pickup! "
ステップ3:スマートクォートとアクセント付き文字をGSM-7互換文字に変換する
多くの場合、Unicode文字はMicrosoft WordやGoogleドキュメントなどのワードプロセッサからコピー&ペーストした際にメッセージに混入します。これらのプロセッサは、標準的なストレートクォート(' や ")をカールした「スマート」クォート(‘, ’, “, ”)に自動的に変換します。
こうした些細な変更によってシステムがSMSを複数に分割して送信するのを防ぐために、文字マッピングテーブルを設定できます。これにより、70文字のUCS-2制限をトリガーすることなく、テキストの読みやすさを維持できます。
- ‘ および ’ を標準的なアポストロフィ ' に変換する
- “ および ” を標準的なダブルクォーテーション " に変換する
- エムダッシュ(—)やエヌダッシュ(―)を標準的なハイフン(-)に変換する
- é, á, í などのアクセント付き文字を、アクセントなしの e, a, i に変換する
これらの文字を明示的にマッピングすることで、メッセージのプロフェッショナルな外観を維持しつつ、厳密に単一セグメントの制限内に収めることができます。これは、自動予約通知を送信しながら運用コストを低く抑える必要がある、歯科医院、修理店、語学学校などの地域密着型ビジネスに特に役立ちます。
ステップ4:定額制セグメント課金のSMSゲートウェイに切り替える
Unicode文字を削除することは機能的な回避策ではありますが、ブランドのトーン&マナーを妥協することになります。2026年の現在、顧客は絵文字、地域特有の表現、プロフェッショナルなフォーマットを含む自然なコミュニケーションを求めています。高い通信費を避けるためだけに、顧客とのコミュニケーションを基本的なASCII文字に制限する必要はもうありません。
Twilio、Plivo、MessageBirdなどの従来のクラウドサービスは、データパケットごとに通信キャリアへの手数料を支払う必要があるため、厳格なセグメントごとの課金を適用しています。さらに、これらのレガシー通信プラットフォームを使用するには、複雑な A2P SMS 登録、10DLCキャリア承認、および毎月の固定費への対応が必要です。
これに代わる選択肢として人気が高まっているのが、MySMSGate のようなAndroidベースのSMSゲートウェイを使用する方法です。MySMSGateは、お持ちのAndroidスマートフォンとSIMカードをフル機能のSMS送信デバイスに変換します。メッセージはスマートフォンのSIMカード(通常、無料通話・通信や大幅に割引されたローカルSMS定額プランが含まれています)を介して直接送信されるため、従来のセグメント課金を完全に回避できます。
MySMSGateは、メッセージにUnicode文字や絵文字が含まれているか、あるいは複数セグメントにまたがっているかに関わらず、送信されたSMS1通あたり一律0.02ドルのフラットレートで課金します。月額サブスクリプション、契約、キャリア登録の遅延は一切ありません。メッセージの配信に失敗した場合は、残高が自動的に返金されます。
一斉送信SMSの比較、信頼性、到達率において最適なSMS APIの代替案をお探しなら、Android SMSゲートウェイへの移行が、Unicode課金問題の根本的な解決策になります。
ステップ5:複数電話番号からのSMS管理を設定する
複数の拠点で展開する地域密着型のビジネスにとって、メッセージングインフラの管理は急速に複雑化する可能性があります。たとえば、5つの歯科医院や3つの自動車修理工場を管理している場合、単一の集中管理インターフェースから複数の電話番号からのテキストメッセージ送信管理をサポートするシステムが必要です。
MySMSGateを使用すると、単一のアカウントダッシュボードに無制限の数のAndroidデバイスを接続できます。これにより、複数の番号をシームレスに管理できます。
- アカウントの作成: MySMSGate で登録し、APIキーを取得します。
- Androidアプリのインストール: AndroidデバイスにMySMSGateコンパニオンアプリをダウンロードします。
- QRコードで接続: 各スマートフォンのカメラを使用して、ウェブダッシュボードに表示されるQRコードをスキャンします。これにより、複雑なAPIキーを入力することなく、デバイスが中央アカウントに即座にリンクされます。
- デュアルSIMの管理: お使いのスマートフォンがデュアルSIMをサポートしている場合、ダッシュボードまたはAPIコール内で直接、メッセージの送信に使用するSIMスロットを選択できます。
このマルチデバイス構造により、顧客がすでに認識しているローカルの電話番号から通知を送信できるため、開封率と返信率が大幅に向上します。受信したすべての返信はウェブベースの「Web Conversations(ウェブ会話)」ダッシュボードに自動的に転送され、コンピューターから直接、リアルタイムの双方向チャットが可能になります。
ステップ6:REST API経由で最初のUnicode対応SMSを送信する
インディー開発者、フリーランサー、または技術に精通したビジネスオーナーであれば、MySMSGateのソフトウェアへの統合は非常に簡単です。このプラットフォームは、最小限のセットアップでSMS通知をトリガーできる、すっきりとしたシングルエンドポイントのREST APIを提供しています。
以下は、cURLを使用してSMSを送信するためのPOSTリクエストの作成例です。セグメントコストの増加を心配することなく、絵文字や特別なUnicode文字を含めることができる点に注目してください。
curl -X POST https://mysmsgate.net/api/v1/send
-H "Authorization: Bearer YOUR_API_KEY"
-H "Content-Type: application/json"
-d '{
"to": "+1234567890",
"message": "Your vehicle is ready for pickup! 🚗 Please reply to this message if you have any questions.",
"device_id": "your_device_id",
"sim_slot": 1
}'より詳細なプログラミング言語での実装については、公式の MySMSGate APIドキュメント をご覧ください。Python、Node.js、PHP、Go、Rubyの本番環境対応コードスニペットに加え、Zapier、Make.com、n8nなどの自動化プラットフォーム用の事前構築済みコネクタが用意されています。
よくある質問
Unicode SMSの分割、文字数制限、課金体系に関する最も一般的な質問への回答を以下にまとめました。
なぜ絵文字が1つ入るだけで、SMSが複数のメッセージとして送信されるのですか?
標準のテキストメッセージはGSM-7エンコーディングを使用しており、1セグメントあたり最大160文字を送信できます。絵文字はGSM-7文字セットに含まれていません。絵文字を追加すると、キャリアはメッセージ全体をUCS-2(Unicode)エンコーディングに切り替える必要があり、セグメント制限が70文字に下がります。メッセージが70文字を超える場合、複数のセグメントに分割され、従来のAPIではセグメントごとに課金されます。
送信前にテキストにUnicodeが含まれているか確認する方法はありますか?
オンラインのSMS文字数チェッカーを使用するか、コード内で簡単な正規表現検索を実行して、GSM-7以外の文字を検出できます。または、データベース内のGSM-7以外の文字にフラグを立てたり、送信SMSキューに渡す前に削除したりするバリデーションスクリプトを作成することもできます。
MySMSGateはUnicodeや複数セグメントのメッセージに対して追加料金を請求しますか?
いいえ。160文字または70文字のセグメントごとに課金するTwilioやVonageなどの従来のAPIとは異なり、MySMSGateは送信されたメッセージ1通につき一律0.02ドルのフラット料金です。メッセージはAndroidスマートフォンのSIMカードを介して直接ルーティングされるため、セグメントごとの支払いは発生せず、隠れた費用を心配することなく絵文字や長文メッセージを送信できます。
Android SMSゲートウェイを使用するために、キャリア登録や10DLC登録は必要ですか?
いいえ。MySMSGateはお手持ちの物理的なAndroidスマートフォンとSIMカードを介してメッセージをルーティングするため、メッセージは標準的な個人間(P2P)トラフィックとして送信されます。つまり、複雑で高額、かつ時間のかかるA2P 10DLC登録を行ったり、キャリアの承認を待ったりする必要はありません。
Comments (0)
Be the first to comment!