Почему одна русская буква может превратить SMS в два сообщения

Из-за русской буквы весь текст SMS может занять больше байтов.

Почему одна русская буква может превратить SMS в два сообщения

Написали короткое сообщение, поправили одну букву, а телефон уже собирается отправить две части. Текст почти не изменился, но для его передачи понадобился другой способ записи. Разберём, откуда берутся лимиты 160 и 70 знаков и почему обычный счётчик символов не всегда может предсказать число SMS.

В статье вы узнаете:

Одна буква изменилась, длина осталась прежней

Возьмём учебное сообщение на английском. Кавычки вокруг него не нужны, перенос строки в конце тоже:

Meeting at 18:00. Bring your notebook. We will discuss the new plan and finish by 19:00.

В нём 88 знаков с пробелами и точками. Все они входят в базовый алфавит GSM, который позволяет уместить в одной SMS до 160 таких знаков. Сообщение проходит с большим запасом.

Теперь заменим только первую латинскую M на русскую М: начало станет Мeeting. Это намеренная замена одной буквы ради примера. На экране она почти незаметна, число знаков по-прежнему 88.

Но кириллицы в базовом GSM-алфавите нет. При обычной отправке без замены букв на латиницу приходится использовать двухбайтовую запись для всего текста. Вместимость одной SMS падает до 70 обычных знаков. Не только русская М, но и остальные 87 знаков теперь занимают больше места.

88 больше 70, поэтому одна SMS уже не подходит. В распространённом варианте длинного сообщения части вмещают по 67 таких знаков: 67 уйдут в первую, 21 во вторую. Получатель может увидеть их как один связный текст, хотя переданы две части.

Одна русская буква не обязана удваивать любое сообщение. Если после смены записи весь текст помещается в 70 знаков, он останется одной SMS. В нашем примере сработало сочетание двух условий: сменился способ записи и был превышен новый предел.

Почему помещаются то 160, то 70 знаков

SMS ограничена не длиной строчки на экране. Для текста и его внутренних служебных данных отведено до 140 байт. Это не размер всей сетевой передачи: у неё есть и другие поля.

Разные способы записи расходуют этот небольшой запас по-разному. Для знака базового GSM-алфавита хватает 7 бит. В байте 8 бит, поэтому такие знаки можно упаковать плотнее, чем по одному на байт:

140 × 8 ÷ 7 = 160 знаков.

Для обычных русских букв используется запись по 2 байта на знак, известная в SMS как UCS-2. В том же месте помещается меньше текста:

140 ÷ 2 = 70 знаков.

Оба предела описаны в спецификации алфавитов SMS ETSI. Размер поля не уменьшился, русские буквы не стали длиннее на экране. Просто для передачи каждого обычного знака требуется больше данных.

Отсюда полезная поправка: «160 знаков на английском» является удобным сокращением, а не точным правилом. Важно, какие именно буквы и знаки стоят в тексте. Язык сообщения сам по себе этого не гарантирует.

Почему длинное сообщение вмещает меньше текста в каждой части

Если текст не поместился, недостаточно просто разрезать его на куски по 70 знаков. Телефону получателя нужно узнать, какие части относятся друг к другу и в каком порядке их собрать.

Поэтому каждая часть несёт служебную пометку: общий идентификатор сообщения, число частей и номер этой части. В распространённом варианте пометка занимает 6 байт из тех же 140. Для текста остаются 134 байта.

134 ÷ 2 = 67 обычных двухбайтовых знаков в части.

Для базового GSM-алфавита после такой пометки остаётся 153 семибитных места. Получаются знакомые пары: 160 в отдельной SMS и 153 в части длинной; 70 и 67 соответственно для обычного двухбайтового текста.

Пометка нужна в каждой части, включая первую. Поэтому русский текст из 71 обычного знака при этих условиях разбивается не как 70 + 1, а как 67 + 4. А 135 знаков потребуют уже трёх частей: 67 + 67 + 1. Первая часть не сохраняет прежнюю вместимость только потому, что отправляется первой.

Это один распространённый вариант, описанный в спецификации устройства SMS ETSI. Бывают более длинные служебные пометки, в том числе с другим размером идентификатора. Поэтому 153 и 67 полезны для понимания и проверки, но не являются обещанием для любого сервиса и любого сообщения.

Почему скобка и эмодзи тоже могут изменить расчёт

Даже внутри GSM-алфавита не всё стоит одинаково. Некоторые знаки находятся в дополнительной таблице. Например, фигурная скобка { занимает два семибитных места: сначала передаётся указание на дополнительную таблицу, затем сам знак. Обычный счётчик покажет одну скобку, а запас SMS уменьшится на два места.

С эмодзи простого правила «одна картинка равна одному знаку» тоже нет. Видимый значок может требовать нескольких единиц записи, а иногда собираться из нескольких символов. Поэтому предел 70 нельзя понимать как обещание отправить 70 любых эмодзи. Подробно эта разница разобрана в статье о том, что считать одним символом.

Счётчик символов полезен для первого шага: вставьте обычный русский текст без эмодзи и посмотрите «Символы с пробелами». Для привычных букв, цифр и простой пунктуации это даст нужную длину. Пробелы между словами тоже занимают место.

Но этот инструмент не является счётчиком SMS. Он не выбирает способ передачи, не учитывает двойной расход места для знаков дополнительной GSM-таблицы и не добавляет служебные пометки к частям. Его число нельзя безоговорочно делить на 70 или 160. Особенно если сообщение смешанное или содержит эмодзи.

Что проверить перед отправкой

Сначала убедитесь, что речь действительно об SMS. Одна программа сообщений может передавать и SMS, и интернет-сообщения, например RCS или iMessage. Одинаковый вид переписки не означает одинаковые ограничения.

Затем проверяйте окончательный текст: с пробелами, переносами строк, подписью и добавленными ссылками. Число для черновика уже не подходит, если сервис дописал в конце несколько слов. На границе вместимости даже короткая добавка способна создать новую часть.

Окончательное число частей смотрите в отправляющем приложении или сервисе, если он его показывает. Именно там учитываются выбранная запись текста, служебные данные и возможные преобразования. Не нужно отправлять платное пробное сообщение только ради проверки.

И не путайте число частей с ценой. Как они оплачиваются, зависит от условий отправки и тарифа, а не от одной таблицы 160/70. Задача подсчёта проще: убедиться, что сравниваются одинаковые вещи. Видимая длина отвечает на вопрос «сколько написано», число SMS на вопрос «сколько отдельных частей понадобится передать».

Есть что добавить?

Напишите своё мнение, комментарий или предложение.