GSM-7 vs UCS-2: por qué un emoji duplica tu factura de SMS

Un solo emoji puede duplicar o triplicar en silencio una factura de SMS. GSM 03.38 define dos codificaciones para la carga útil de 140 bytes: GSM-7 compacto a 160 caracteres, o UCS-2 a 70. Cualquier carácter fuera del alfabeto GSM-7 obliga a todo el mensaje a UCS-2. Desarrolladores y marketers que pegan texto desde procesadores de textos suelen descubrirlo solo cuando llegan las facturas.

Empaquetado GSM-7: 160 caracteres en una carga útil de 140 bytes

Los SMS se diseñaron en torno a una carga útil fija de datos de usuario de 140 bytes. GSM 03.38 define un alfabeto predeterminado de 7 bits para que esos 140 bytes contengan 160 septetos: 140 por 8 dividido entre 7 es igual a 160. Cuando un mensaje permanece por completo dentro de ese alfabeto, el terminal y el SMSC lo tratan como un único segmento de hasta 160 caracteres. El conjunto básico cubre letras latinas mayúsculas y minúsculas, dígitos, puntuación habitual y un puñado de símbolos monetarios y nacionales. Espacios, saltos de línea y los caracteres habituales de la prosa en inglés caben sin penalización.

La concatenación cambia la aritmética. Los mensajes multiparte insertan una cabecera de datos de usuario (UDH) para que el dispositivo receptor reensamble los segmentos en orden. Una UDH típica de 6 bytes consume espacio de septetos y deja 153 caracteres de texto útil por segmento en GSM-7. La facturación es casi siempre por segmento, no por mensaje lógico, así que un cuerpo GSM-7 de 200 caracteres se convierte en dos segmentos facturables (153 más el resto). Entender la división 160 frente a 153 es el primer paso para predecir el coste antes de pulsar enviar.

La tabla de extensión: caracteres que ya cuestan dos septetos

GSM 03.38 also defines an extension table reached by a dedicated escape septet. Characters such as the square brackets [ ], curly braces { }, caret ^, tilde ~, vertical bar |, backslash \, and the euro sign are not in the basic set. Each of them is encoded as escape plus the extension codepoint, so each consumes two of the 160 (or 153) available septets. A message that looks short on screen can therefore cross a segment boundary earlier than a naïve character count suggests.

El mecanismo de escape sigue siendo GSM-7; no pasa el mensaje a UCS-2. Esa distinción importa. Puedes incluir unos pocos euros o corchetes y permanecer en el empaquetado eficiente de 7 bits. Solo cuando el codificador encuentra un punto de código que no existe ni en el alfabeto básico ni en la tabla de extensión, todo el mensaje abandona GSM-7. Hasta ese momento, cada carácter —incluidos los de extensión de doble coste— se sigue contando en septetos respecto al límite de 160 o 153.

Clase de carácterSeptetos consumidos en GSM-7
Alfabeto básico (A–Z, a–z, 0–9, puntuación habitual)1
Extension table ([ ] { } ^ ~ | \ and euro)2 (escape + código)
Cualquier cosa fuera de GSM 03.38 (emoji, comillas tipográficas, la mayoría de no latinos)Fuerza todo el mensaje a UCS-2

Reserva UCS-2: un carácter fuera del alfabeto recodifica todo

En el momento en que un carácter no puede representarse en GSM-7, el codificador pasa todos los datos de usuario a UCS-2 de 16 bits (en la práctica unidades de código UTF-16 del BMP). La misma carga útil de 140 bytes solo admite entonces 70 caracteres. Con una UDH de concatenación, la longitud útil baja a 67 caracteres por segmento. No hay reserva parcial: un solo emoji, una comilla tipográfica, un guion corto o un carácter de árabe, cirílico, CJK u la mayoría de otros sistemas de escritura reescribe todo el cuerpo. Una frase en inglés de 140 caracteres que era un segmento GSM-7 se convierte en tres segmentos UCS-2 al añadir una cara sonriente.

Este es el mecanismo detrás de la factura sorpresa. Los marketers suelen redactar el texto en un procesador, pegarlo en una herramienta de SMS e introducir sin saberlo comillas tipográficas o un espacio de no separación. Los desarrolladores que interpolan nombres generados por usuarios o títulos de producto pueden inyectar el mismo disparador invisible. Como la recodificación es todo o nada, el recuento de segmentos salta de forma discontinua. La facturación se multiplica por el nuevo total de segmentos. Cifras globales publicadas como 0,0125 US $ por mensaje, con tarifas desde 0,004 $ en 149 países, hacen concreta la aritmética: cada segmento extra es otro cargo completo, no un añadido fraccionario.

CodificaciónLímite de segmento únicoLímite de segmento concatenado
GSM-7 (7 bits)160 caracteres153 caracteres
UCS-2 (16 bits)70 caracteres67 caracteres

Trampas invisibles y escrituras que fuerzan UCS-2

Los procesadores de textos sustituyen habitualmente apóstrofos y comillas rectas por formas tipográficas curvas, convierten dobles guiones en rayas y insertan espacios de no separación. Ninguno de esos puntos de código pertenece a GSM 03.38. Un mensaje que en pantalla parece idéntico a una versión ASCII simple puede viajar por tanto como UCS-2 y costar varios segmentos. Lo mismo ocurre con contenido copiado de páginas web o herramientas de diseño que favorecen Unicode más rico. Comprobar los puntos de código reales, no los glifos renderizados, es la única defensa fiable.

La elección de idioma es igual de decisiva. El inglés puro, el francés básico, el alemán, el español y mensajes similares en escritura latina suelen permanecer en GSM-7 si se evitan o transliteran las letras acentuadas fuera del alfabeto predeterminado. El griego, el cirílico, el árabe, el hebreo, el devanagari, el tailandés y la familia CJK no tienen mapeo GSM-7 para las letras ordinarias, así que cualquier uso sustancial de esas escrituras fuerza UCS-2 en todo el mensaje. Basta incluso un solo nombre o palabra de producto en esas escrituras. Los emoji de todo tipo quedan fuera de GSM-7 por definición. La regla práctica es simple: si el carácter no está en el conjunto básico o de extensión de GSM 03.38, toda la carga útil pasa a 70/67.

Soluciones prácticas antes de enviar

La transliteración mantiene los mensajes en GSM-7 a costa de la fidelidad ortográfica. Sustituir caracteres acentuados por los equivalentes ASCII más cercanos, convertir comillas tipográficas en rectas y mapear rayas de nuevo a guiones suele restaurar los límites 160/153. Para nombres de marca o texto legal que deban permanecer exactos, acepta UCS-2 y presupuesta el mayor recuento de segmentos. Las comprobaciones previas automatizadas que buscan puntos de código no GSM-7 e informan del total de segmentos resultante en ambas codificaciones dan a desarrolladores y marketers una señal clara de coste antes de enviar el mensaje al SMSC.

Al crear plantillas, vigila los campos variables: un nombre de cliente en otra escritura o un título de producto con un emoji puede cambiar en silencio una plantilla que de otro modo sería GSM-7. Limpia o normaliza los buffers de pegado de fuentes de texto enriquecido. Prefiere puntuación ASCII recta en el copy de marketing destinado a SMS. Si debes enviar emoji o texto no latino, diseña el cuerpo para que los límites de segmento UCS-2 caigan en pausas naturales de frase y mantén la longitud total en el menor número posible de bloques de 67 caracteres. Los contadores de longitud conscientes del segmento que cambian la visualización entre 160/153 y 70/67 según el alfabeto detectado eliminan la mayor parte de la sorpresa. Las tarifas varían según operador y ruta; las cifras publicadas citadas antes ilustran el modelo por segmento más que una tarifa universal. Sigue habiendo incertidumbre honesta en torno al renderizado exacto en terminales de caracteres límite, así que prueba en dispositivos representativos cuando el mensaje importe.

Preguntas frecuentes

¿Por qué al añadir un emoji mi SMS se convierte en varios mensajes?
Cualquier carácter fuera del alfabeto GSM 03.38, incluidos todos los emojis, fuerza el mensaje completo de GSM-7 a UCS-2. La carga útil de 140 bytes pasa a admitir 70 caracteres en lugar de 160 (67 en lugar de 153 si está concatenado). Un cuerpo que cabía en un segmento GSM-7 puede convertirse así en dos o tres segmentos UCS-2, y la facturación se cobra por segmento.
¿Las comillas tipográficas y las rayas largas cambian de verdad la codificación SMS?
Sí. Las comillas tipográficas, las rayas largas, las rayas medias y los espacios de no separación no pertenecen a los conjuntos básico o de extensión de GSM-7. Pegarlos desde un procesador de textos recodifica todo el mensaje como UCS-2 y reduce el límite por segmento de 160/153 a 70/67, aunque el texto parezca igual en pantalla.
¿Cuántos caracteres caben en un SMS concatenado con GSM-7 frente a UCS-2?
Con GSM-7 un segmento concatenado admite 153 caracteres tras el UDH típico de 6 bytes. Con UCS-2 el mismo encabezado deja 67 caracteres por segmento. Los límites de segmento único son 160 para GSM-7 y 70 para UCS-2. El número de segmentos, no el de mensajes lógicos, determina el coste.

Relacionado