BroadNet
La revistaIngeniería
Ingeniería

Codificación y segmentación de mensajes SMS: GSM-7, Unicode (UCS-2) y mensajes multipartes.

Un SMS contiene 140 bytes: 160 caracteres GSM-7, o solo 70 en Unicode (UCS-2). La codificación, el UDH y la segmentación determinan el límite de caracteres y el costo de tu SMS.

10 min de lectura
Ingeniería · Número 19
10 min de lectura

l límite de caracteres de los SMS depende completamente de la codificación. Cada SMS contiene una carga útil fija de 140 bytes, por lo que un mensaje que utilice el alfabeto predeterminado GSM-7 admite 160 caracteres, mientras que uno que contenga cualquier carácter que no sea GSM-7 (un emoji, una letra árabe, una comilla rizada) cambia a UCS-2 de 16 bits y solo admite 70. Los textos más largos se dividen en segmentos que se facturan por separado.

¿Necesitas los números de un mensaje específico? Pégalo en la calculadora de segmentos SMS para ver la codificación, el número de segmentos y el presupuesto de caracteres, o comprueba exactamente qué caracteres fuerzan Unicode con el verificador GSM-7 / Unicode.

Todo se deriva de 140 bytes.

El cuerpo de un mensaje SMS —el campo que 3GPP denomina TP-User-Data— tiene un límite de 140 octetos, o 1120 bits. Esta única restricción determina el número de caracteres que se mostrarán en cualquier texto. La cantidad de caracteres que caben se calcula dividiendo 1120 entre el número de bits que consume cada carácter, por lo que la única cuestión importante es qué codificación activa el texto. En la práctica, dos codificaciones son relevantes: GSM-7 y UCS-2.

GSM-7 vs UCS-2: dos maneras de empaquetar los mismos 140 bytes.

GSM-7: el alfabeto predeterminado de 7 bits

GSM-7 es el alfabeto SMS predeterminado definido en 3GPP TS 23.038. Codifica cada carácter en 7 bits, por lo que 1120 bits contienen 160 caracteres, el límite clásico para un solo SMS. Su tabla incluye las letras latinas, dígitos, signos de puntuación comunes y algunos símbolos. Es importante destacar que un pequeño conjunto de caracteres se encuentra en una extensión del conjunto de caracteres básico y cada uno cuesta dos septetos, ya que se codifica como un byte de escape seguido del carácter. Estos caracteres son ^ { } \ [ ] ~ | y el símbolo del euro €. Por lo tanto, un mensaje con símbolos de euro solo cabe en 80 caracteres en un solo SMS, no en 160.

Puedes ver exactamente qué caracteres de tu texto son alfabéticos, de extensión o fuera de alfabeto con el verificador GSM-7 / Unicode antes de enviarlo.

UCS-2: Unicode de 16 bits

Cuando el texto contiene incluso un solo carácter que GSM-7 no puede representar, todo el mensaje se vuelve a codificar en UCS-2, una codificación Unicode de 16 bits de ancho fijo. Con 16 bits por carácter, 1120 bits solo pueden contener 70 caracteres. No hay actualización parcial ni mezcla: un solo carácter fuera del alfabeto reduce a la mitad el límite de caracteres, de 160 a 70. Esto no es un error: un SMS declara una única codificación para todo su cuerpo, por lo que el remitente debe elegir la que pueda representar todos los caracteres presentes.

Los límites de caracteres, uno al lado del otro

CodificaciónBits por carácterMensaje únicoPor segmento (multiparte)
GSM-7 (alfabeto predeterminado)7160153
UCS-2 (Unicode de 16 bits)167067

Las cifras por segmento son inferiores a los límites de un solo mensaje porque un mensaje concatenado utiliza parte de sus 140 bytes para la cabecera, que se explica a continuación. Cabe destacar que los caracteres de extensión mencionados anteriormente también ocupan dos posiciones GSM-7 dentro de un segmento, por lo que un segmento lleno de corchetes o símbolos de euro contiene muchos menos de 153 caracteres visibles.

Cómo funciona el SMS multipartes (concatenado)

Los textos que ocupan más de un mensaje no se truncan: el SMSC emisor los divide en segmentos, cada uno un SMS independiente, y el terminal receptor los vuelve a unir antes de mostrarlos. La coordinación se gestiona mediante un encabezado de datos de usuario (UDH) situado al principio de la carga útil de cada segmento, definido en 3GPP TS 23.040. Para la concatenación estándar, el UDH tiene 6 bytes e incluye un número de referencia compartido por cada parte, el número total de partes y el número de secuencia de esta parte para que el terminal pueda reconstruirlas en orden.

snippet
UDH para un SMS concatenado = 6 bytes
05 00 03 RR TT SS
| | | | | |
| | | | | +- número de secuencia de esta parte (1..TT)
| | | | +---- número total de partes (TT)
| | | +------- número de referencia (idéntico en cada parte)
| | +---------- longitud de este elemento de información = 3
| +------------- IEI = 00 (SMS concatenado, referencia de 8 bits)
+---------------- longitud de UDH = 05 (siguen 5 bytes más)

Esos 6 bytes provienen de la misma carga útil de 140 bytes, dejando 134 bytes para el texto. Por eso, un mensaje multiparte contiene 153 caracteres GSM-7 por segmento (el encabezado está alineado por septetos, consumiendo siete de las 160 posiciones) y 67 caracteres UCS-2 por segmento (134 bytes ÷ 2). Algunas plataformas usan un UDH de 7 bytes con un número de referencia de 16 bits, lo que reduce esas cifras a 152 y 66. La calculadora de segmentos SMS muestra la división exacta para cualquier longitud de mensaje.

Por qué un emoji o un carácter árabe lo cambia todo

Aquí es donde los remitentes se sorprenden. Dado que un solo carácter que no sea GSM-7 obliga a convertir todo el mensaje a UCS-2, una notificación en inglés de 150 caracteres que cabe cómodamente en un segmento puede reducirse silenciosamente a 70 caracteres —y dividirse en tres segmentos— en el momento en que alguien pega un emoji o una cita ingeniosa de un procesador de texto. El número de caracteres visibles no cambió; la codificación sí.

Para los remitentes del mercado árabe, esto no es una excepción, sino la norma. El alfabeto árabe no pertenece al alfabeto GSM-7, por lo que cada SMS en árabe utiliza el sistema UCS-2 desde el primer carácter: 70 caracteres en un solo mensaje y 67 por segmento a partir de entonces. Un mensaje bilingüe en árabe e inglés, o una contraseña de un solo uso (OTP) en árabe con marca, se divide rápidamente en varios segmentos. Los equipos que envían mensajes a través del Consejo de Cooperación del Golfo (CCG), Arabia Saudita, Emiratos Árabes Unidos y Egipto deben presupuestar todas las plantillas en árabe en unidades UCS-2 desde el principio, no en GSM-7.

Caracteres comunes que transmiten silenciosamente un mensaje completo a UCS-2:

  • Emoji de cualquier tipo, incluyendo un solo 😀 al final en un mensaje de marketing.
  • Árabe, hebreo, cirílico, griego, chino y otros alfabetos no latinos.
  • Comillas curvas y apóstrofes (’ ‘ “ ) copiados de procesadores de texto.
  • Los guiones cortos y largos (– —), los puntos suspensivos (…) y el espacio de no separación.
  • Muchas letras latinas acentuadas que no están presentes en la tabla GSM-7.

¿Qué te cuesta la segmentación?

Cada segmento se factura como un mensaje independiente. Una alerta GSM-7 de 160 caracteres es un SMS facturable; si se añade un carácter, se convierten en dos segmentos (hasta 306 caracteres de capacidad) que se facturan como dos. Una contraseña de un solo uso (OTP) en árabe de tan solo 75 caracteres ya consta de dos segmentos UCS-2 y, por lo tanto, de dos mensajes, aunque parezca corta. A escala de OTP y campaña, la disciplina de codificación es un concepto fundamental, no un detalle superficial.

  1. Mantenga las plantillas transaccionales dentro de un mismo segmento (160 GSM-7 o 70 UCS-2), siempre que el idioma lo permita.
  2. Eliminar caracteres Unicode accidentales: normalizar las comillas curvas, los guiones y los espacios de no separación a sus equivalentes GSM-7 antes de enviarlos.
  3. Valide la codificación y el recuento de segmentos en el momento de la compilación, no después de la factura, utilizando un verificador en su canalización de envío.
  4. Presupuestar plantillas en árabe y otros idiomas no latinos en unidades UCS-2 (70/67) desde el principio.
  5. Recorte el contenido variable (URL, nombres largos de comerciantes) que pueda hacer que un mensaje supere el límite de un segmento durante la ejecución.
La API de SMS de BroadNet informa sobre la codificación resuelta y el número de segmentos de cada mensaje antes de su envío y en cada confirmación de entrega, lo que permite visualizar y controlar la segmentación en producción en lugar de descubrirla en la factura. Encontrará todos los detalles de la solicitud y la respuesta en la documentación para desarrolladores.

Preguntas frecuentes

¿Cuántos caracteres tiene un SMS?

Un SMS contiene una carga útil de 140 bytes. Utilizando el alfabeto predeterminado GSM-7, que consta de 160 caracteres, si el texto contiene algún carácter que no sea GSM-7 (un emoji, una letra acentuada o árabe, una comilla rizada), el mensaje cambia a la codificación UCS-2 y admite 70 caracteres. Los textos más largos se dividen en segmentos concatenados de 153 caracteres (GSM-7) o 67 caracteres (UCS-2) cada uno.

¿Por qué mi SMS solo cuenta como 70 caracteres?

Dado que algún elemento del texto no pertenece al alfabeto GSM-7, todo el mensaje se recodificó en UCS-2 de 16 bits, que solo admite 70 caracteres. Los errores más comunes suelen ser los emojis, los alfabetos no latinos y las comillas curvas, los guiones o los espacios de no separación copiados de un procesador de texto. Al reemplazar o eliminar dicho carácter, el mensaje vuelve a ajustarse al límite de 160 caracteres del GSM-7.

¿Qué es la codificación UCS-2 en SMS?

UCS-2 es la codificación Unicode de 16 bits de ancho fijo que utilizan los SMS cuando el texto no puede representarse con el alfabeto GSM-7 de 7 bits. Dos bytes por carácter significa que la carga útil de 140 bytes contiene 70 caracteres en un solo mensaje, o 67 por segmento en un mensaje multipartes. Cualquier carácter árabe, emoji u otro carácter que no sea GSM-7 en el cuerpo del mensaje obliga a convertir todo el SMS a UCS-2.

¿Por qué se dividió mi mensaje en dos?

El texto excedía el límite de un solo mensaje para su codificación (160 caracteres en GSM-7 o 70 en UCS-2), por lo que se envió como un mensaje concatenado (multipartes). Cada segmento lleva una cabecera de datos de usuario de 6 bytes para su reensamblaje, lo que reduce la capacidad a 153 (GSM-7) o 67 (UCS-2) caracteres por parte, y cada segmento se factura como un mensaje independiente.

Referencias

¿Te ha resultado útil?

Cómo redactamos y revisamos el contenido

Escrito por

Equipo editorial de BroadNet

El equipo editorial publica el blog de BroadNet. Los artículos se escriben con los equipos de BroadNet de asuntos regulatorios, producto, ingeniería, investigación del sector y soluciones para operadores, y se revisan según nuestras normas editoriales.

La revista, por correo electrónico

Un ensayo al mes. Nada más.

Suscríbete y te enviaremos el próximo artículo —sobre ingeniería, normativa o industria— el mismo día de su publicación. Sin campañas de goteo, sin promociones de productos, sin compartir con terceros. Cancela tu suscripción con un solo clic.

Enviamos un correo al mes. Puede darse de baja cuando quiera. Consulte nuestra política de privacidad.

Lo que obtendrás
  • Texto extenso, no contenido para generar enlaces.
    De seis a once minutos de escritura concentrada en un solo tema.
  • Escrito por operadores
    Ingenieros, responsables de asuntos regulatorios y redacción de productos internos.
  • Consciente de la región
    Perspectiva sobre reguladores, operadores y combinación de canales desde la perspectiva de la región MENA.
  • Una vez al mes
    Sin campañas de goteo. Un ensayo cuando haya alguno para compartir.
Deja de leer. Empieza a enviar.

La mayor parte de lo que escribimos lo aprendimos durante la producción.

Si este artículo te ha hecho asentir con la cabeza, deberíamos hablar. Menciona el caso de uso, los volúmenes, los mercados; te ofreceremos opciones de enrutamiento, precios y un cliente de referencia con el que podrás contactar.

$ curl -X POST https://api.broadnet.me/sms/sendSms