También disponible en: English · Português · Français · العربية
Generador de enlaces tel: y por qué tel:555-1234 no es válido
Crea un enlace tel: conforme y compara dos de ellos con el algoritmo de igualdad del RFC 3966.
¿Qué es un enlace tel:?
Una URI tel: es la forma en que una página web entrega un número de teléfono a lo que sea que haga llamadas en el dispositivo de quien lee. Lo pones en un href y al tocarlo se marca; eso lo sabe todo el mundo. Lo que casi nadie sabe es que tel: tiene una gramática de verdad, definida en el RFC 3966, y que la forma que enseña prácticamente cualquier tutorial no la cumple.
La gramática tiene dos formas. Un número global empieza por más y son solo dígitos decimales —tel:+34911234567— y se sostiene solo en cualquier parte del mundo. Un número local no empieza por más, y la gramática exige que lleve un parámetro phone-context que diga dónde es válido: tel:863-1234;phone-context=+1-914. Ese parámetro no es un adorno opcional. Está dentro de la propia producción local-number, así que un tel:555-1234 a secas no es una URI tel: incompleta: no es una URI tel:.
Esta página analiza lo que le des contra esa gramática, dice de qué forma se trata y qué significa cada parte, escribe la forma canónica y —por separado— responde si dos URI son el mismo número según las reglas de comparación del propio estándar.
Cómo se usa
- Pega una URI tel:, o escribe un número y mira cómo cambia el veredicto. Los cinco botones de ejemplo cargan casos reales, empezando por el inválido que escribe todo el mundo. El nombre del esquema no distingue mayúsculas, así que TEL: también se analiza.
- Lee los detalles y las notas. El panel de detalles separa el número tal como está escrito del número que se usa para comparar, e indica si un phone-context es un dominio o un número, cosa que cambia cómo se compara. Las notas son cosas válidas pero que conviene saber, nunca errores.
- Usa el panel de comparación para la pregunta que las cadenas no responden. Pega dos URI y aplica las cinco reglas del RFC 3966. Sus ejemplos incluyen dos que se ven distintas y son el mismo número, y un par que se diferencia en un solo parámetro y por tanto no lo es.
Por qué falla tel:555-1234 y qué escribir en su lugar
La ABNF que importa son tres líneas. La parte del abonado es o un global-number o un local-number; global-number son solo dígitos con parámetros opcionales; y local-number se escribe como local-number-digits, después parámetros, después context, después más parámetros. Como context aparece ahí sin condición alguna, y context se define como la cadena «;phone-context=» seguida de un descriptor, un número local sin él sencillamente no tiene derivación.
Hay dos arreglos y el estándar prefiere uno. La sección 5.1 dice que todos los números deben usar la forma global salvo que no puedan representarse así, o sea que la primera respuesta es escribir el número con +, el prefijo de país y el resto. Solo cuando un número no puede expresarse globalmente de verdad —que es el caso de las extensiones de una centralita, los números cortos y los de emergencia— se recurre a la forma local y se le engancha un contexto: o un nombre de dominio que identifique el plan de numeración, o un prefijo global como +34.
Conviene tener claro qué se rompe y qué no. Un teléfono normalmente marcará tel:555-1234 igualmente, porque un marcador no es un validador y hace lo evidente. El coste es que la URI no lleva ninguna información sobre a qué plan de numeración pertenecen esos dígitos, así que cualquier cosa que tenga que interpretarla en lugar de marcarla —un directorio, un CRM, una pasarela de click-to-call, cualquier cosa que compare dos registros— está adivinando. La gramática existe justamente para quitar esa adivinanza.
Las reglas de comparación, que las cadenas se saltan
La sección 4 del RFC 3966 define cuándo dos URI tel: son equivalentes, y es un algoritmo de verdad más que una comparación de texto. Las dos tienen que ser de la misma forma. Los dígitos deben coincidir tras eliminar todos los separadores visuales —el guion, el punto y los paréntesis forman parte de la gramática y están para leerse, así que tel:+1-555-0100 y tel:+15550100 son el mismo número—. El phone-context se compara como nombre de host cuando es un dominio y dígito a dígito cuando es un número, o sea que EXAMPLE.COM. y example.com coinciden mientras que el caso numérico se compara sin separadores. Los parámetros se comparan por nombre, sin importar el orden en que aparezcan. Y toda la comparación ignora mayúsculas.
Hay una regla que sorprende: si un parámetro aparece en solo una de las dos URI, no son iguales. Así que tel:+15550100 y tel:+15550100;ext=1 son números distintos, cosa que es correcta —una extensión identifica otro extremo— pero implica que no puedes quitar los parámetros que no entiendas y comparar lo que quede.
También hay una regla de orden normativa que casi nadie cumple. La extensión o la subdirección RDSI van primero, después phone-context, y después todos los demás parámetros por orden alfabético. El estándar da su motivo en el mismo párrafo: es para que una URI tel: pueda compararse carácter a carácter, que es como las compara SIP. La forma canónica que imprime esta página aplica ese orden.
Límites honestos
Esto comprueba la gramática de la URI y nada más. No tiene ni idea de si un número existe, de si el prefijo de país es real o de cuántos dígitos usa el plan de numeración de ese país: ese es otro trabajo, el de las bibliotecas de números de teléfono que llevan un conjunto de datos detrás, y aquí no se intenta a propósito. Una URI puede ser perfectamente conforme y aun así ser un número al que no contesta nadie.
Tampoco puede decirte si el contexto de un número local es el correcto, solo que es un dominio o un prefijo global sintácticamente válido. Y la respuesta sobre igualdad es la del RFC 3966, que va de URI: dos URI distintas pueden llegar al mismo teléfono en el mundo real por un enrutado que ninguna comparación de texto podría conocer.
Una cosa que conviene saber sobre la plataforma: nada de esto te lo da el navegador. Como tel no es uno de los esquemas especiales del estándar de URL, new URL devuelve toda la parte del abonado como una ruta opaca, no valida nada —acepta tel:555-1234 sin rechistar— y comparar dos objetos URL por href dice que tel:+1-555-0100 y tel:+15550100 son distintos. No es un fallo: un analizador genérico de URI responde a una pregunta genérica. Pero sí significa que cada afirmación de esta página hay que calcularla, no tomarla prestada.
¿Por qué es gratis?
Es una gramática y una comparación de cinco reglas, y tu navegador ejecuta las dos mientras escribes. No interviene ningún servidor, así que no hay nada que medir ni cuenta que crear.
No se sube nada. Los números que pegues se quedan en esta pestaña.