UCS-2 — это 16-битная кодировка, которую SMS использует для любого текста с символами вне алфавита GSM-7 — нелатинские письменности, эмодзи, типографские кавычки. Каждый символ занимает два октета, поэтому одно SMS в UCS-2 вмещает 70 символов, а конкатенированные сегменты — по 67. Один символ не из GSM-7 вынуждает всё сообщение перейти на UCS-2.
Зачем SMS нужен UCS-2
GSM-7 покрывает лишь 128 символов плюс небольшой набор расширения. Всё остальное — арабица, китайский, кириллица, иврит, тайский, эмодзи и даже типографские символы вроде типографских кавычек и коротких тире — непредставимо. Для них SMS переключается на UCS-2, кодировку фиксированной ширины в 16 бит (фактически UTF-16 в обратном порядке байтов для базовой многоязычной плоскости). Она сигнализируется значением data_coding 0x08.
Ёмкость: 70 и 67
Поле пользовательских данных SMS составляет 140 октетов. При двух октетах на символ UCS-2 умещает 70 символов в одно сообщение. Когда сообщение конкатенируется, 6-байтовый User Data Header занимает часть полезной нагрузки, оставляя 134 октета — 67 символов на сегмент. Это меньше половины ёмкости GSM-7, поэтому выбор кодировки сильно влияет на стоимость.
| Кодировка | Одиночный SMS | На каждый сегмент составного сообщения |
|---|---|---|
| GSM-7 (7-bit) | 160 симв. | 153 симв. |
| 8-битный двоичный код | 140 байт | 134 байта |
| UCS-2 (16-bit) | 70 симв. | 67 символов |
Что запускает UCS-2
Кодировка выбирается по принципу «всё или ничего» на сообщение: один символ вне GSM-7 вынуждает всё сообщение перейти на UCS-2, снижая ёмкость со 160 до 70. Распространённые виновники легко внести случайно — типографский апостроф из текстового редактора, длинное тире, эмодзи или нелатинское имя. Обнаружение их перед отправкой — самый мощный рычаг влияния на стоимость SMS.
| Категория | Примеры |
|---|---|
| Emoji | 😀 ✅ 🚀 ❤️ |
| Типографская пунктуация | ' ' “ ” – — … |
| Нелатинские алфавиты | العربية · 中文 · Кириллица · עברית · ไทย |
| Буквы с диакритикой, отсутствующие в GSM-7 | â ê î ô û ã õ ą ę ř |
Оговорка о суррогатных парах
UCS-2 строго 16-битна и покрывает базовую многоязычную плоскость Unicode. Символы выше U+FFFF — например, многие современные эмодзи — представляются в UTF-16 суррогатными парами из двух 16-битных кодовых единиц, поэтому один такой эмодзи занимает четыре октета (два «символа» UCS-2). Поэтому сообщение, выглядящее как один эмодзи, может считаться за два в пределе 70/67.
Часто задаваемые вопросы
Сколько символов умещается в Unicode SMS?
70 символов в одном сообщении UCS-2 и 67 на сегмент, когда сообщение конкатенируется. Это потому, что каждый символ занимает 16 бит (два октета) при пределе полезной нагрузки SMS в 140 октетов.
Что заставляет SMS переключиться на UCS-2?
Любой одиночный символ вне алфавита GSM-7 — эмодзи, типографская кавычка, длинное тире или нелатинский текст — вынуждает всё сообщение перейти на UCS-2. Кодировка выбирается на сообщение, а не на символ.
UCS-2 — это то же самое, что UTF-16?
Почти. UCS-2 фиксированно 16-битна и покрывает базовую многоязычную плоскость. SMS трактует полезную нагрузку как UTF-16 в обратном порядке байтов, поэтому символы выше U+FFFF (многие эмодзи) становятся суррогатными парами и занимают четыре октета.
Почему один эмодзи иногда считается за два символа?
Эмодзи выше U+FFFF кодируются как суррогатные пары UTF-16 — две 16-битные кодовые единицы — поэтому один глиф занимает две из 70 (или 67) доступных позиций символов UCS-2.
Как случайно не отправить UCS-2?
Очищайте ввод перед отправкой: заменяйте типографские кавычки и тире их ASCII-эквивалентами, удаляйте или транслитерируйте случайные акценты и проверяйте наличие эмодзи. Проверка GSM-7/Unicode отметит конкретные символы, вынуждающие UCS-2.
Технические характеристики источника
На этой странице представлены опубликованные стандарты, на которых они основаны. (Открывается в новой вкладке)