граничение на количество символов в SMS-сообщениях полностью зависит от кодировки. Каждое SMS-сообщение содержит фиксированный объем данных в 140 байт, поэтому сообщение, использующее стандартный алфавит GSM-7, вмещает 160 символов, в то время как сообщение, содержащее любой символ, не входящий в GSM-7 — эмодзи, арабскую букву, фигурную цитату — переключается на 16-битный UCS-2 и вмещает только 70 символов. Более длинный текст разбивается на сегменты, за которые взимается отдельная плата.
Хотите узнать параметры конкретного сообщения? Вставьте его в калькулятор сегментов SMS, чтобы увидеть кодировку, количество сегментов и лимит символов, или проверьте, какие именно символы принудительно используют Unicode, с помощью проверки GSM-7 / Unicode.
Всё происходит из 140 байтов.
Тело SMS-сообщения — поле, которое 3GPP называет TP-User-Data — ограничено 140 октетами, или 1120 битами. Это единственное ограничение определяет количество символов, которое вы когда-либо увидите в цитатах. Количество символов, помещающихся в сообщение, просто равно 1120, деленному на количество бит, потребляемых каждым символом, поэтому единственный реальный вопрос заключается в том, какая кодировка используется для вашего текста. На практике важны две кодировки: GSM-7 и UCS-2.
GSM-7 против UCS-2: два способа упаковки одних и тех же 140 байт.
GSM-7: 7-битный алфавит по умолчанию
GSM-7 — это стандартный алфавит SMS, определенный в 3GPP TS 23.038. Он кодирует каждый символ в 7 битах, поэтому 1120 бит содержат 160 символов — классический предел для одного SMS-сообщения. Его таблица охватывает латинские буквы, цифры, распространенные знаки препинания и несколько символов. Важно отметить, что небольшой набор символов находится в базовом расширении набора символов, и каждый из них стоит два септета, поскольку он кодируется как управляющий байт, за которым следует символ. Этими символами являются ^ { } \ [ ] ~ | и знак евро €. Таким образом, сообщение, дополненное знаками евро, вмещает только 80 символов в одном SMS-сообщении, а не 160.
Перед отправкой вы можете точно определить, какие символы в вашем тексте входят в алфавит, являются расширенными или выходят за его пределы, используя проверку GSM-7 / Unicode.
UCS-2: 16-битный Unicode
Если текст содержит хотя бы один символ, который GSM-7 не может представить, всё сообщение перекодируется в UCS-2, 16-битную кодировку Unicode с фиксированной шириной. При 16 битах на символ, 1120 бит вмещают всего 70 символов. Частичного обновления и смешивания не происходит: один символ, не входящий в алфавит, уменьшает ваш бюджет вдвое, со 160 до 70. Это не ошибка — SMS-сообщение объявляет одну кодировку для всего своего тела, поэтому отправитель должен выбрать ту, которая может представить каждый присутствующий символ.
Ограничения по количеству символов, рядом друг с другом.
| Кодирование | Битов на символ | Одно SMS | По сегментам (многокомпонентные) |
|---|---|---|---|
| GSM-7 (алфавит по умолчанию) | 7 | 160 | 153 |
| UCS-2 (16-битный Unicode) | 16 | 70 | 67 |
Показатели на сегмент ниже, чем ограничения для отдельных сообщений, поскольку в объединенном сообщении часть из 140 байт тратится на заголовок, который будет рассмотрен далее. Обратите внимание, что дополнительные символы, указанные выше, также занимают две позиции GSM-7 внутри сегмента, поэтому сегмент, состоящий из квадратных скобок или знаков евро, содержит гораздо меньше 153 видимых символов.
Как работает многокомпонентное (собранное) SMS-сообщение
Текст, превышающий длину одного сообщения, не обрезается — отправляющий SMSC разбивает его на сегменты, каждый из которых представляет собой самостоятельное SMS-сообщение, а принимающий телефонный аппарат объединяет их обратно перед отображением. Координация осуществляется с помощью заголовка пользовательских данных (UDH), расположенного в начале полезной нагрузки каждого сегмента, определенного в 3GPP TS 23.040. Для стандартной конкатенации UDH имеет размер 6 байт и содержит ссылочный номер, общий для каждой части, общее количество частей и порядковый номер этой части, чтобы телефонный аппарат мог собрать их в правильном порядке.
UDH для объединенного SMS = 6 байт 05 00 03 RR TT SS | | | | | | | | | | | +- порядковый номер этой части (1..TT) | | | | +---- общее количество частей (TT) | | | +------- номер ссылки (одинаковый для каждой части) | | +---------- длина этого информационного элемента = 3 | +------------- IEI = 00 (объединенный SMS, 8-битная ссылка) +---------------- Длина UDH = 05 (следуют еще 5 байт)Эти 6 байтов извлекаются из того же 140-байтового полезного содержимого, оставляя 134 байта для текста. Именно поэтому многокомпонентное сообщение содержит 153 символа GSM-7 на сегмент (заголовок выровнен по септетам, занимая семь из 160 позиций) и 67 символов UCS-2 на сегмент (134 байта ÷ 2). Некоторые платформы используют 7-байтовый UDH с 16-битным номером ссылки, что снижает эти значения до 152 и 66. Калькулятор сегментов SMS показывает точное распределение для любой длины сообщения.
Почему один смайлик или один арабский символ меняет всё
Вот тут отправителей ждет сюрприз. Поскольку один символ, не соответствующий стандарту GSM-7, заставляет все сообщение быть преобразованным в UCS-2, 150-символьное уведомление на английском языке, которое обычно помещается в один сегмент, может незаметно сократиться до 70 символов и разделиться на три сегмента в тот момент, когда кто-то вставляет эмодзи или «умную» фигурную цитату из текстового редактора. Видимое количество символов не изменилось; изменилось кодирование.
Для отправителей, работающих на арабском рынке, это не исключение, а стандартная ситуация. Арабский алфавит не входит в алфавит GSM-7, поэтому каждое SMS-сообщение на арабском языке начинается с UCS-2: 70 символов в одном сообщении, 67 символов в каждом последующем сегменте. Двуязычное сообщение на арабском и английском языках или фирменный OTP-код на арабском языке быстро переходит в несколько сегментов. Командам, отправляющим сообщения в странах Персидского залива, Саудовской Аравии, ОАЭ и Египте, следует с самого начала закладывать в бюджет каждый шаблон сообщения на арабском языке единицы UCS-2, а не GSM-7.
Распространенные символы, которые незаметно заставляют передавать все сообщение в UCS-2:
- Любые эмодзи, включая одиночный завершающий символ 😀 в маркетинговых сообщениях.
- Арабский, иврит, кириллица, греческий, китайский и другие нелатинские алфавиты.
- Фигурные кавычки и апострофы (« ‘ “ ») скопированы из текстовых редакторов.
- Тире (– —), многоточие (…) и неразрывный пробел.
- Много латинских букв с диакритическими знаками, отсутствующих в таблице GSM-7.
Во сколько вам обходится сегментация
Каждый сегмент оценивается и оплачивается как отдельное сообщение. Уведомление GSM-7 длиной в 160 символов — это одно платное SMS-сообщение; добавьте один символ, и оно превратится в два сегмента — до 306 символов — оплачиваемых как два отдельных сообщения. Арабский OTP-код длиной всего в 75 символов уже представляет собой два сегмента UCS-2, а значит, и два сообщения, хотя и выглядит коротким. При масштабах OTP-кодов и кампаний контроль за кодированием является прямой статьей расходов, а не просто косметической деталью.
- Храните шаблоны транзакций в пределах одного сегмента — 160 GSM-7 или 70 UCS-2 — там, где это позволяет язык программирования.
- Удаляйте ненужные символы Юникода: нормализуйте фигурные кавычки, тире и неразрывные пробелы до их эквивалентов GSM-7 перед отправкой.
- Проверяйте кодировку и количество сегментов во время сборки, а не после выставления счета, используя средство проверки в конвейере отправки.
- Бюджетные шаблоны арабского языка и другие нелатинские шаблоны в единицах UCS-2 (70/67) с самого начала.
- Удаляйте переменное содержимое — URL-адреса, длинные названия продавцов — которое может привести к выходу сообщения за пределы сегмента во время выполнения.
API для SMS-сообщений от BroadNet сообщает о разрешенной кодировке и количестве сегментов каждого сообщения перед его отправкой и в каждом подтверждении доставки, поэтому вы можете видеть и контролировать сегментацию в рабочей среде, а не обнаруживать ее в счете. Полная информация о запросах и ответах содержится в документации для разработчиков.
Часто задаваемые вопросы
Сколько символов в одном SMS-сообщении?
Одно SMS-сообщение содержит 140 байт полезной нагрузки. Используется стандартный алфавит GSM-7, состоящий из 160 символов; если текст содержит какой-либо символ, выходящий за рамки GSM-7 — эмодзи, букву с диакритическим знаком или арабскую букву, фигурную кавычку — сообщение переключается на кодировку UCS-2 и содержит 70 символов. Более длинный текст разбивается на объединенные сегменты по 153 (GSM-7) или 67 (UCS-2) символов каждый.
Почему мое SMS-сообщение учитывается только как 70 символов?
Поскольку в тексте отсутствует часть алфавита GSM-7, всё сообщение было перекодировано в 16-битный UCS-2, который вмещает всего 70 символов. Обычно это эмодзи, нелатинские символы, фигурные кавычки, тире или неразрывные пробелы, скопированные из текстового редактора. Замена или удаление этого символа возвращает сообщение к 160 символам, предусмотренным стандартом GSM-7.
Что такое кодирование UCS-2 в SMS?
UCS-2 — это 16-битная кодировка Unicode фиксированной ширины, используемая SMS-сообщениями, когда текст не может быть представлен 7-битным алфавитом GSM-7. Два байта на символ означают, что полезная нагрузка размером 140 байт содержит 70 символов в одном сообщении или 67 символов в сегменте многокомпонентного сообщения. Любой арабский текст, эмодзи или другой символ, не относящийся к GSM-7, в теле сообщения заставляет все SMS-сообщение быть преобразовано в UCS-2.
Почему мое сообщение разделилось на две части?
Текст превысил лимит для одного сообщения в своей кодировке — 160 символов в GSM-7 или 70 в UCS-2 — поэтому он был отправлен как объединенное (многокомпонентное) сообщение. Каждый сегмент содержит 6-байтовый заголовок пользовательских данных для повторной сборки, что снижает емкость до 153 (GSM-7) или 67 (UCS-2) символов на часть, и каждый сегмент оплачивается как отдельное сообщение.
Ссылки
- 3GPP TS 23.038 — Алфавиты и информация, специфичная для языка (алфавит по умолчанию GSM-7 и UCS-2): 3gpp.org
- 3GPP TS 23.040 — Техническая реализация службы коротких сообщений (SMS), включая заголовок пользовательских данных: 3gpp.org
- BroadNet — инструменты: Калькулятор сегментов SMS и Проверка GSM-7 / Unicode.
