在构建自动化系统或向客户发送通知时,许多企业主和开发者惊讶地发现,自己每月的短信账单比预期高出一倍。这篇全面指南提供了一份特殊字符发送短信所需字数的对照表,帮助您了解隐蔽的编码转换如何大幅增加您的短信发送成本。
为什么特殊字符会改变短信长度和成本
在电信标准中,短信并不是按您撰写的原始字数计费,而是按“分条”(segments)计费。标准的短信分条使用 GSM-7 字符集进行编码,每条短信最多允许 160 个字符。然而,一旦您引入了该标准字符集之外的任何一个字符——例如表情符号、西里尔字母,甚至是自 Microsoft Word 复制的精美“智能引号”——整条短信的编码就会转变为 UCS-2 (Unicode)。
在 UCS-2 编码下,“即使包含特殊字符和表情符号,短信也限制在 160 个字符以内”是一个常见的误区。实际上,一旦检测到单个非 GSM 字符,每条短信的最大字符限制就会立即从 160 个字符降至仅 70 个字符。如果您的短信长度为 71 个字符且包含一个表情符号,它将被拆分并被 Twilio 或 Plivo 等传统 API 提供商作为两条独立的短信分条进行计费。
了解哪些特殊字符通常会影响短信对于降低运营成本至关重要,特别是当您经营诊所、美容院或维修店等本地服务型业务,需要向客户发送预约提醒时。
详解 GSM-7 与 UCS-2 编码
GSM-7 是一种专门为短信设计的 7 位(7-bit)字符编码标准。它包含大多数拉丁字符、数字和基本标点符号。UCS-2 是一种 16 位(16-bit)编码标准,几乎可以表示任何语言中的任何字符(包括表情符号),但每个字符需要双倍的数据量。这种数据开销正是运营商网络在触发 UCS-2 时将分条容量降至 70 个字符的原因。
终极 SMS 特殊字符对照表
以下是特殊字符发送短信所需字数的对照表。该表列出了标准 GSM-7 字符、GSM-7 扩展字符(在 160 个字符限制内占用 2 个字符空间)以及会强制执行严格 70 字符限制的 UCS-2 字符。
| 字符类别 | 示例字符 | 每个字符的位数 | 短信中的字符权重 | 最大分条限制 |
|---|---|---|---|---|
| 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 个字符的限制中会记为两个字符。然而,使用非 GSM 字符(如西班牙语 sms y caracteres especiales 配置中常用的“á”)或弯引号“’”会立即将您的短信分条限制降至 70 个字符。
特殊字符如何影响您的短信成本
为了解特殊字符对短信成本的影响(即 los caracteres especiales que impacto tienen en el coste de los 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 个字符的限制之内,因此仅需支付 1 条短信分条的费用。
然而,由于带重音符号的“É”,短信被迫转换为 UCS-2 编码。此时分条限制变为了 70 个字符。您这篇 123 个字符的短信会被拆分为两个分条(由于分条信头,第一条为 67 个字符,第二条为 56 个字符)。传统的 API 网关将向您收取 2 条短信的费用,而不是 1 条。
如果您使用的是传统服务商,这种分条可能会使您每月的账单翻倍甚至翻三倍。这就是为什么许多企业会寻找 Twilio 替代方案 或参考 最便宜的短信 API 指南,以避免因分条而产生的额外费用。
如何避免在短信中使用特殊字符?
如果您希望将短信字数控制在 160 个字符以内并避免意外费用,您必须主动清理短信内容。以下是关于如何避免在短信中使用特殊字符的实用策略:
- 清理复制粘贴的文本: 许多 CRM 模板包含“智能”标点符号。例如,从富文本编辑器复制的弯引号(’)或逗号可能会影响正常发送或触发 Unicode。在现实中,某些企业内部系统会向客服人员发出简短警告:“发送外呼短信特殊字符提示:请注意,发送的任何外呼短信必须在 250 个字符以内。如果您的短信是从保存的模板复制粘贴的,且包含逗号 (,) 或单引号 ('),请删除该特殊字符,并在发送前重新手动输入”。将智能引号替换为标准直引号(')可确保符合 GSM-7 标准。
- 通过代码自动替换非 GSM 字符: 如果您的系统是动态生成短信的,可以实现一个转写函数,将“á”替换为“a”、“é”替换为“e”、““”替换为“"”等。
- 处理特定平台的限制: 如果您在企业级低代码平台上进行开发,请注意它们是如何处理编码的。例如在管理 special characters in gsm outsystems 集成时,文本变量在 JSON 序列化过程中可能会自动将标准标点符号转换为 Unicode 等效字符。
用于清理短信文本的 Python 代码段
以下是一个简单的 Python 函数,用于清除短信无法识别的特殊字符,或会强制使用昂贵的 UCS-2 编码的特殊字符:
import unicodedata
def sanitize_for_gsm7(text):
# 将常见的智能标点符号映射为 GSM-7 等效字符
replacements = {
'\u2018': "'", '\u2019': "'", # 智能单引号
'\u201c': '"', '\u201d': '"', # 智能双引号
'\u2013': '-', '\u2014': '-', # 连接号和破折号
'\u20ac': 'EUR' # 如有需要,替换欧元符号
}
for unicode_char, gsm_char in replacements.items():
text = text.replace(unicode_char, gsm_char)
# 消除重音符号(例如,将 é 转换为 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))
# 输出: "Hello! Your appointment is confirmed for tomorrow e."
使用 MySMSGate 消除编码焦虑
对于本地服务型企业、学校和诊所来说,担心字符编码、分条限制和复杂的计费结构是一件令人头疼的事。这就是为什么在传统的 SMS网关与SMS API 之间做出选择变得至关重要。
MySMSGate 彻底解决了这个问题。MySMSGate 不会通过收费昂贵且有着严格分条计费规则的运营商网络发送您的短信,而是将您自己的 Android 手机和 SIM 卡转变为一个 SMS 网关。
以下是 MySMSGate 如何为注重成本的企业带来变革:
- 统一费率计费: 我们对发送的每条短信收取 0.02 美元的统一费用,无论长度、字符编码或分条数如何。您无需担心表情符号或重音字符会使您的账单翻倍。
- 使用您自己的号码: 短信直接从您 Android 手机的 SIM 卡中发送。您的客户将看到一个本地、可识别的手机号码,从而提高回复率和阅读率。
- 无需复杂的注册: 避开传统 API(如 Twilio)所需的复杂 10DLC 注册、运营商审批以及每月品牌费。
- 双卡与多设备支持: 在单个控制面板中管理多部手机和 SIM 卡,为每次与客户的对话精准选择发送线路。
常见问题
阅读以下关于短信字符编码、特殊字符和短信限制的常见问题。
哪些特殊字符会将短信限制减少到 70 个字符?
任何未包含在标准 GSM-7 字符集中的字符都会强制使用 UCS-2 编码,从而将限制降至 70 个字符。这包括表情符号、非拉丁字母(西里尔字母、阿拉伯语、希腊语、希伯来语)以及某些带重音的字母或艺术化标点(如弯引号)。
空格算作短信中的字符吗?
是的,在 GSM-7 和 UCS-2 编码标准中,每个空格都算作一个字符。
为什么我只发了一条短信,短信平台却收了我多条短信的钱?
如果您的短信超过了 160 个字符(GSM-7 编码下)或 70 个字符(UCS-2 编码下),运营商会将该短信拆分为多个分条。传统的 API 是按分条计费的,这意味着一条长短信的费用很容易达到基础费率的 2 倍或 3 倍。
如何测试我的短信是否包含特殊字符?
您可以使用在线短信分条计算器,或者在后端运行一个简单的清理脚本,以便在将文本发送给 API 提供商之前检测它是否会触发 UCS-2 Unicode 编码。
Comments (0)
Be the first to comment!