Как рассчитывается длина SMS
Одно SMS содержит 140 октетов (1 120 бит) пользовательских данных. В 7-битном алфавите GSM по умолчанию каждый символ занимает 7 бит, поэтому в 140 октетов помещается 160 символов. В UCS-2 (16-битная кодировка Unicode, используемая в SMS) каждый символ занимает 2 октета, поэтому в то же пространство помещается 70 символов.
Если сообщение длиннее одного SMS, оно отправляется как составное (конкатенированное). Каждая часть начинается с заголовка пользовательских данных (UDH) размером 6 октетов. В нём указаны ссылочный номер, общее число частей и позиция части, чтобы телефон мог собрать сообщение. После заголовка на часть остаётся 134 октета: 153 символа GSM-7 или 67 символов UCS-2.
Получатель видит одно сообщение, но операторы и провайдеры тарифицируют каждую часть. Сообщение из 161 символа в GSM-7 стоит как два SMS, а сообщение из 71 символа на арабском тоже стоит как два.
- GSM-7: 160 символов в одном SMS, 153 на часть в составном сообщении (306 для 2 частей, 459 для 3).
- UCS-2: 70 символов в одном SMS, 67 на часть в составном сообщении (134 для 2 частей, 201 для 3).
- Один символ вне GSM-7 в любом месте текста переводит всё сообщение в UCS-2.
Алфавит GSM-7 и его таблица расширения
7-битный алфавит GSM по умолчанию описан в 3GPP TS 23.038 (изначально GSM 03.38). Его базовая таблица содержит 128 позиций: латинские буквы и цифры, распространённые знаки препинания, а также символы @ £ $ ¥ è é ù ì ò Ç Ø ø Å å Ä Ö Ñ Ü ä ö ñ ü à ß Æ æ É ¿ ¡ § и греческие заглавные буквы Δ Φ Γ Λ Ω Π Ψ Σ Θ Ξ. Перевод строки и возврат каретки тоже являются одиночными символами.
Ещё десять символов находятся в таблице расширения и вызываются через escape-код, поэтому каждый занимает два септета: знак евро €, знак вставки ^, фигурные скобки { }, квадратные скобки [ ], тильда ~, вертикальная черта |, обратная косая черта \ и перевод страницы. Сообщение из 158 букв и одного € занимает ровно 160 септетов; добавьте ещё одну букву, и получится два сегмента.
Escape-последовательность должна оставаться в одной части, поэтому символ из двух септетов, который пришёлся бы на границу в 153 септета, переносится в следующую часть. Этот счётчик учитывает такое правило, поэтому часть может заканчиваться на 152-м символе.
TS 23.038 также определяет таблицы сдвига национальных языков (например, для турецкого, испанского, португальского и нескольких индийских письменностей), которые позволяют сохранить часть сообщений в 7-битной кодировке. Поддержка зависит от сети и устройства, поэтому большинство платформ, как и этот счётчик, используют только алфавит по умолчанию.
Символы, которые незаметно переводят SMS в Unicode
Большинство неожиданных сообщений с лимитом 70 символов появляются из-за текста, скопированного из текстового редактора, CMS или с клавиатуры телефона, которые автоматически вставляют типографские символы. Они почти не отличаются от своих аналогов в GSM-7, но это другие кодовые позиции.
Буквы с диакритикой, которых нет в таблице, например á í ó ú â ê ã õ и строчная ç, тоже переводят сообщение в UCS-2. Заменяйте их, только если ваша аудитория принимает написание без диакритики: для многих языков правильная орфография важнее лишнего сегмента.
- Типографские кавычки и апострофы ‘ ’ “ ” (используйте ' и ").
- Короткое и длинное тире – — (используйте -) и многоточие … (используйте ...).
- Неразрывные и тонкие пробелы, которые после копирования часто остаются невидимыми (используйте обычный пробел).
- Символы нулевой ширины и метки порядка байтов, скрытые в шаблонах (удалите их).
- Эмодзи: большинство занимает 2 единицы UCS-2, флаг или эмодзи с оттенком кожи — 4, а составная последовательность, например семья, — 8 и более.
Конвертация сообщения в GSM-7 в один клик
Если сообщение в Unicode, кнопка «Конвертировать в GSM-7» переписывает его только символами GSM-7 там, где это безопасно: типографские кавычки и тире заменяются обычными, невидимые пробелы удаляются, диакритика, которой нет в GSM-7, убирается (á → a, ã → a, строчная ç → Ç), а лигатуры и символы заменяются буквенной записью (œ → oe, ™ → TM). Символы, которые уже входят в GSM-7, такие как é, ü, ñ, ß и €, сохраняются.
Инструмент перечисляет все изменения и показывает число сегментов до и после, а кнопка «Отменить» возвращает исходный текст. Арабский текст конвертировать нельзя: сообщение на арабском всегда остаётся в Unicode с лимитом 70 символов на SMS, поэтому сократите его или отправьте через WhatsApp. Эмодзи и другие нелатинские письменности тоже остаются без изменений.
SMS на арабском: 70 символов, 67 на часть
Арабских букв нет в GSM-7, поэтому каждое SMS на арабском отправляется в UCS-2: 70 символов в одном сообщении и по 67 на часть, если оно длиннее. Арабское сообщение из 140 символов — это три тарифицируемых сегмента, а не два, потому что 140 больше, чем 2 × 67 = 134.
Учитывается каждая кодовая позиция: пробелы, латинские буквы внутри текста, арабо-индийские цифры и диакритические знаки (ташкиль). Слово с полной огласовкой может занимать вдвое больше единиц, чем то же слово без огласовок (харакат), поэтому в транзакционных сообщениях не используйте диакритику, если она не нужна для устранения неоднозначности.
Для OTP-кодов и уведомлений в странах Персидского залива (GCC) по возможности держите арабский текст короче 70 символов, ставьте код в начало сообщения и не используйте эмодзи. Если отправлять то же уведомление на английском, текст может быть более чем вдвое длиннее при той же цене.
От сегментов к стоимости
Ежемесячный счёт за SMS зависит от сегментов, а не от сообщений: сегментов в сообщении × сообщений в месяц × тариф сети назначения. Если сократить кампанию с 2 сегментов до 1, стоимость каждой отправки снизится вдвое.
Проверяйте итоговый текст с подставленными переменными. Имя клиента, номер заказа или сокращённая ссылка могут сдвинуть шаблон через границу сегмента, а имена на арабском или с диакритикой могут перевести шаблон GSM-7 в UCS-2 только для части получателей.
- Проверяйте самые длинные реалистичные значения каждой переменной.
- Сокращайте ссылки и удаляйте пробелы и переносы строк в конце текста.
- Лучше один понятный призыв к действию, чем длинное многосегментное сообщение.
