Ya son dos personas las que lo han preguntado en este blog, y algunas más que he visto hacerlo en otros foros y páginas de noticias. Resulta que mucha gente se queja de que envía mensajes SMS y los destinatarios reciben un mensaje lleno de caracteres raros (símbolos ASCII en realidad: @, #, y cosas del estilo).
A mí personalmente no me ha pasado, pro he estado dando una vuelta y creo que he encontrado el problema: fuente 1, fuente 2, fuente 3.
Otra cosa es que no estoy del todo seguro a qué teléfonos afecta y con qué ROM’s ni versiones. De entrada se suelen quejar los usuarios de HTC Magic y HTC Hero. Es posible que a otros terminales con Android este problema no les afecte.

Se trata de lo siguiente, el problema tiene dos partes:

  • El estándar de notificación SMS admite caracteres de 7 bits, es decir todas las letras incluída la ñ, pero sin acentos. Los acentos ocupan 8 bits. Así, cuando se incluye un acento en un mensaje el teléfono cambia la codificación de todo el mensaje para adaptarla a caracteres de 8 bits. Eso significa que se pueden incluir menos caracteres en el mensaje.
    A efectos del cliente eso no es así, el cliente siempre ve las letras que le quedan en el mensaje, y una letra con acento sólo le cuenta como una letra más. Pero después la operadora parte el mensaje para enviarlo en formato de 7 bits, y si no le cabe todo en uno (160 caracteres máximo) entonces lo envía en 2 partes, o en 3, según lo que necesite.
    Habréis oído a gente quejándose de que Movistar con el iPhone cobra más caros los mensajes que contienen “ñ”. Es por el mismo motivo: la conversión de caracteres.
    El caso es que en Android, al utilizar una letra con acento éste convierte todo el mensaje a unicode de 16 bits (UTF-16). Esta parte la supongo yo, no la he leído en ningún sitio y puede que me equivoque. Quizá trabaje con UTF-8, pero yo supongo que será 16 por la forma de crecer la longitud del mensaje tan desmesurada, imagino que pensando en dar cabida a todo tipo de carcteres extraños (latinos, alemanes, etc).
    En fin, el caso es que de esta forma cada letra del mensaje, con o sin acento, pasa a ocupar 16 bits. Esto normalmente se traduciría en que cabrían sólo 10 letras en un mensaje, pero en lugar de eso el teléfono permite seguir editando para añadir tantos caracteres como se desee. El resultado final es que la operadora partirá el mensaje en trozos y lo enviará, tarificando al usuario tantos mensajes como partes haya enviado.
  • Aquí viene la segunda parte del problema. Resulta que los mensajes MMS (mensajes multimedia) son similares a los SMS (texto), pero permiten muchos más carcteres. De hecho, cuando adjuntamos una fotografía o un vídeo el teléfono y la operadora no entienden lo que es, sólo entienden los bits que se transmiten. Un mensaje MMS puede permitir más de 1000 caracteres de 7 bits, algunas operadoras incluso más de 3000. El coste de un MMS suele ser como el triple de lo que vale un SMS.
    Y esta es la raíz del problema. Cuando escribimos un mensaje que ocupa más de 2 partes Android cambia el tipo de mensaje a MMS, porque entiende que será más barato enviar un MMS que 3 o 4 partes SMS.

Juntando las dos cosas, lo que pasa es los siguiente:

  • Empezamos a escribir un mensaje
  • A medio mensaje le ponemos un acento
  • Android cambia la codificación a Unicode de 16 bits
  • Nosotros tenemos la impresión de haber escrito un mensaje normal, de unos 150 caracteres
  • Android, al cambiar la codificación de 7 bits a Unicode de 16 bits hace que la longitud del mensaje se multiplique casi por 3
  • Dada la nueva longitud, cambia el tipo de mensaje a MMS para tarificar más barato
  • La operadora finalmente envía un MMS
  • Si el que recibe el mensaje tiene un teléfono sin capacidad para recibir MMS, lo que lee es código ASCII. Es decir, esos simbolitos raros.

Y ese es el problema. Que android cambia el tipo de mensaje a MMS cuando la longitud supera las dos partes de un SMS, y el que lo recibe tiene que tener soporte para MMS o sino recibirá una ristra de basura. Espero con esto haber aclarado las dudas :-)

Por cierto, la solución es fácil: enviad mensajes sin acentos. Y no enviéis mensajes de 4 partes… ¿¿para que?? un mensaje es corto, tiene que ser corto, es como tweet.
Al que le pasan estas cosas demuestra que no entiende la filosofía del SMS (que curiosamente las operadoras describen como mensaje CORTO… por algo será).

ACTUALIZACIÓN: explicación más larga, técnica y detallada aquí (vía @androides)