GSM-7 vs UCS-2: почему один эмодзи удваивает счет за SMS
Один эмодзи может незаметно удвоить или утроить счет за SMS. GSM 03.38 определяет две кодировки для полезной нагрузки 140 байт: компактную GSM-7 на 160 символов или UCS-2 на 70. Любой символ вне алфавита GSM-7 переводит все сообщение в UCS-2. Разработчики и маркетологи, вставляющие текст из текстовых процессоров, часто узнают об этом лишь при получении счетов.
Упаковка GSM-7: 160 символов в полезной нагрузке 140 байт
SMS спроектирован вокруг фиксированной пользовательской нагрузки 140 байт. GSM 03.38 задает 7-битный алфавит по умолчанию, поэтому в эти 140 байт помещается 160 септетов: 140 умножить на 8 и разделить на 7 равно 160. Если сообщение целиком остается в этом алфавите, устройство и SMSC обрабатывают его как один сегмент до 160 символов. Базовый набор охватывает прописные и строчные латинские буквы, цифры, обычную пунктуацию и несколько валютных и национальных символов. Пробелы, переносы строк и типичные символы английского текста входят без штрафа.
Конкатенация меняет арифметику. В многосегментные сообщения вставляется User Data Header, чтобы принимающее устройство могло собрать сегменты по порядку. Типичный UDH в 6 байт занимает место септетов, оставляя 153 символа полезного текста на сегмент в GSM-7. Биллинг почти всегда идет за сегмент, а не за логическое сообщение, поэтому тело GSM-7 в 200 символов становится двумя тарифицируемыми сегментами (153 плюс остаток). Понимание разницы между 160 и 153 - первый шаг к прогнозу стоимости до отправки.
Таблица расширений: символы, которые уже стоят два септета
GSM 03.38 также определяет таблицу расширений, к которой обращаются специальным escape-септетом. Такие символы, как квадратные скобки [ ], фигурные скобки { }, карет ^, тильда ~, вертикальная черта |, обратный слэш \ и знак евро, не входят в базовый набор. Каждый из них кодируется как escape плюс кодовая точка расширения, поэтому занимает два из 160 (или 153) доступных септетов. Сообщение, которое на экране выглядит коротким, может из‑за этого пересечь границу сегмента раньше, чем предполагает наивный подсчёт символов.
Механизм экранирования остаётся в GSM-7; он не переводит сообщение в UCS-2. Это различие важно. Можно включить несколько символов евро или скобок и сохранить эффективную 7-битную упаковку. Только когда кодировщик встречает кодовую точку, которой нет ни в базовом алфавите, ни в таблице расширений, все сообщение покидает GSM-7. До этого момента каждый символ, включая расширения двойной стоимости, по-прежнему считается в септетах относительно лимита 160 или 153.
| Класс символов | Септетов в GSM-7 |
|---|---|
| Базовый алфавит (A–Z, a–z, 0–9, обычная пунктуация) | 1 |
| Extension table ([ ] { } ^ ~ | \ and euro) | 2 (escape + код) |
| Все вне GSM 03.38 (эмодзи, фигурные кавычки, большинство нелатинских) | Переводит все сообщение в UCS-2 |
Переключение на UCS-2: один символ вне алфавита перекодирует все
Как только любой символ нельзя представить в GSM-7, кодировщик переводит все пользовательские данные в 16-битный UCS-2 (фактически кодовые единицы UTF-16 для BMP). Та же нагрузка 140 байт вмещает уже только 70 символов. С UDH конкатенации полезная длина падает до 67 символов на сегмент. Частичного переключения нет: один эмодзи, «умная» кавычка, короткое тире или символ из арабского, кириллицы, CJK и большинства других письменностей переписывает все тело. Английское предложение из 140 символов, бывшее одним сегментом GSM-7, становится тремя сегментами UCS-2 после добавления улыбающегося лица.
Именно этот механизм стоит за неожиданным счетом. Маркетологи часто готовят текст в текстовом процессоре, вставляют его в SMS-инструмент и незаметно вносят фигурные кавычки или неразрывный пробел. Разработчики, подставляющие пользовательские имена или названия продуктов, могут внедрить тот же невидимый триггер. Поскольку перекодирование - все или ничего, число сегментов скачет дискретно. Биллинг умножается на новый итог сегментов. Опубликованные точные цифры, например US $0,0125 за сообщение, с тарифами от $0,004 в 149 странах, позволяют конкретно посчитать стоимость: каждый лишний сегмент - это еще одна полная плата, а не дробная надбавка.
| Кодировка | Лимит одного сегмента | Лимит сегмента при конкатенации |
|---|---|---|
| GSM-7 (7-бит) | 160 символов | 153 символа |
| UCS-2 (16-бит) | 70 символов | 67 символов |
Невидимые ловушки и письменности, принудительно включающие UCS-2
Текстовые процессоры регулярно заменяют прямые апострофы и кавычки фигурными типографскими формами, превращают двойные дефисы в длинные тире и вставляют неразрывные пробелы. Ни одна из этих кодовых точек не входит в GSM 03.38. Сообщение, которое на экране выглядит идентично версии в обычном ASCII, поэтому может идти как UCS-2 и стоить несколько сегментов. То же относится к скопированному контенту с веб-страниц или из дизайнерских инструментов, предпочитающих расширенный Unicode. Проверка реальных кодовых точек, а не отображаемых глифов - единственная надежная защита.
Выбор языка столь же критичен. Чистый английский, базовый французский, немецкий, испанский и похожие сообщения на латинице обычно остаются в GSM-7, если избегать или транслитерировать акцентированные буквы вне алфавита по умолчанию. У греческого, кириллицы, арабского, иврита, деванагари, тайского и семейства CJK нет соответствия GSM-7 для обычных букв, поэтому любое существенное использование этих письменностей переводит все сообщение в UCS-2. Даже одного имени или слова продукта в этих письменностях достаточно. Эмодзи любого вида по определению вне GSM-7. Практическое правило простое: если символа нет в базовом наборе или расширениях GSM 03.38, вся нагрузка становится 70/67.
Практические меры до отправки
Транслитерация сохраняет сообщения в GSM-7 ценой орфографической точности. Замена акцентированных символов ближайшими ASCII-эквивалентами, преобразование фигурных кавычек в прямые и возврат длинных тире к дефисам часто восстанавливает лимиты 160/153. Для брендов или юридического текста, который должен оставаться точным, примите UCS-2 и заложите бюджет на большее число сегментов. Автоматические предварительные проверки, сканирующие кодовые точки вне GSM-7 и сообщающие итоговые сегменты в обеих кодировках, дают разработчикам и маркетологам ясный сигнал о стоимости до передачи сообщения в SMSC.
При создании шаблонов тщательно контролируйте переменные поля: имя клиента в другой письменности или название продукта с эмодзи может незаметно переключить иначе GSM-7-шаблон. Очищайте или нормализуйте буферы вставки из источников с форматированным текстом. Предпочитайте прямую ASCII-пунктуацию в маркетинговых текстах для SMS. Если необходимо отправить эмодзи или нелатинский текст, проектируйте тело так, чтобы границы сегментов UCS-2 приходились на естественные паузы фраз, и удерживайте общую длину в как можно меньшем числе блоков по 67 символов. Счетчики длины с учетом сегментов, переключающие отображение между 160/153 и 70/67 по обнаруженному алфавиту, устраняют большую часть сюрпризов. Тарифы зависят от оператора и маршрута; приведенные ранее опубликованные цифры иллюстрируют модель за сегмент, а не универсальный тариф. Остаётся обоснованная неопределённость по точному отображению символов в пограничных случаях на устройствах, поэтому тестируйте на типичных аппаратах, когда сообщение важно.
Часто задаваемые вопросы
- Почему один эмодзи превращает SMS в несколько сообщений?
- Любой символ вне алфавита GSM 03.38, включая любой эмодзи, переводит всё сообщение из GSM-7 в UCS-2. Полезная нагрузка 140 байт тогда вмещает 70 символов вместо 160 (67 вместо 153 при конкатенации). Текст, умещавшийся в один сегмент GSM-7, может стать двумя или тремя сегментами UCS-2, а тарификация идёт за сегмент.
- Действительно ли фигурные кавычки и длинные тире меняют кодировку SMS?
- Да. Типографские фигурные кавычки, длинные тире, короткие тире и неразрывные пробелы отсутствуют в базовом и расширенном наборах GSM-7. Вставка из текстового процессора перекодирует всё сообщение в UCS-2, снижая лимит на сегмент с 160/153 до 70/67, даже если текст на экране выглядит без изменений.
- Сколько символов в конкатенированном SMS при GSM-7 и UCS-2?
- При GSM-7 конкатенированный сегмент вмещает 153 символа после типичного 6-байтного UDH. При UCS-2 тот же заголовок оставляет 67 символов на сегмент. Лимиты одиночного сегмента: 160 для GSM-7 и 70 для UCS-2. Стоимость определяет число сегментов, а не логических сообщений.