Também disponível em: English · Español · Français · العربية
Gerador de link tel: e por que tel:555-1234 não é válido
Monte um link tel: conforme e compare dois deles pelo algoritmo de igualdade da RFC 3966.
O que é um link tel:?
Uma URI tel: é como uma página entrega um número de telefone ao que quer que faça ligações no aparelho de quem lê. Você põe num href, a pessoa toca e disca; isso todo mundo sabe. O que quase ninguém sabe é que tel: tem uma gramática de verdade, definida na RFC 3966, e que a grafia que praticamente todo tutorial mostra não a cumpre.
A gramática tem duas formas. Um número global começa com mais e é só dígitos decimais — tel:+5511987654321 — e se sustenta sozinho em qualquer lugar do mundo. Um número local não começa com mais, e a gramática exige que ele carregue um parâmetro phone-context dizendo onde vale: tel:863-1234;phone-context=+1-914. Esse parâmetro não é enfeite opcional. Ele está dentro da própria produção local-number, então um tel:555-1234 sozinho não é uma URI tel: incompleta — não é uma URI tel:.
Esta página analisa o que você der contra essa gramática, diz de qual forma se trata e o que cada parte significa, escreve a forma canônica e — separadamente — responde se duas URIs são o mesmo número segundo as regras de comparação do próprio padrão.
Como usar
- Cole uma URI tel:, ou digite um número e veja o veredito mudar. Os cinco botões de exemplo carregam casos reais, começando pelo inválido que todo mundo escreve. O nome do esquema não diferencia maiúsculas, então TEL: também é analisado.
- Leia os detalhes e as notas. O painel de detalhes separa o número como está escrito do número usado para comparação, e diz se um phone-context é um domínio ou um número — o que muda como ele é comparado. As notas são coisas válidas mas que vale saber, nunca erros.
- Use o painel de comparação para a pergunta que as strings não respondem. Cole duas URIs e ele aplica as cinco regras da RFC 3966. Os exemplos incluem duas que parecem diferentes e são o mesmo número, e um par que difere por um único parâmetro e portanto não é.
Por que tel:555-1234 falha, e o que escrever no lugar
A ABNF que importa são três linhas. A parte do assinante é ou um global-number ou um local-number; global-number é só dígitos com parâmetros opcionais; e local-number é escrito como local-number-digits, depois parâmetros, depois context, depois mais parâmetros. Como context aparece ali sem condição nenhuma, e context é definido como a string “;phone-context=” seguida de um descritor, um número local sem ele simplesmente não tem derivação.
Há dois consertos e o padrão prefere um deles. A seção 5.1 diz que todos os números devem usar a forma global a não ser que não possam ser representados assim — então a primeira resposta é escrever o número com +, o código do país e o resto. Só quando um número genuinamente não pode ser expresso globalmente, o que vale para ramais de um PABX, números curtos e números de emergência, é que se recorre à forma local e se anexa um contexto: ou um nome de domínio que identifique o plano de numeração, ou um prefixo global como +55.
Vale ser claro sobre o que quebra e o que não. Um telefone normalmente vai discar tel:555-1234 do mesmo jeito, porque um discador não é um validador e faz o óbvio. O custo é que a URI não carrega informação nenhuma sobre a qual plano de numeração aqueles dígitos pertencem, então qualquer coisa que precise interpretá-la em vez de discá-la — um diretório, um CRM, um gateway de click-to-call, qualquer coisa comparando dois registros — está adivinhando. A gramática existe justamente para tirar esse palpite.
As regras de comparação, que as strings erram
A seção 4 da RFC 3966 define quando duas URIs tel: são equivalentes, e é um algoritmo de verdade, não uma comparação de texto. As duas precisam ser da mesma forma. Os dígitos precisam ser iguais depois de remover todos os separadores visuais — o hífen, o ponto e os parênteses fazem parte da gramática e existem para ser lidos, então tel:+1-555-0100 e tel:+15550100 são o mesmo número. O phone-context é comparado como nome de host quando é um domínio e dígito a dígito quando é um número, o que significa que EXAMPLE.COM. e example.com batem, enquanto o caso numérico é comparado sem separadores. Parâmetros são comparados por nome, independentemente da ordem em que aparecem. E a comparação inteira ignora maiúsculas.
Uma regra surpreende: se um parâmetro aparece em só uma das duas URIs, elas não são iguais. Então tel:+15550100 e tel:+15550100;ext=1 são números diferentes, o que está certo — um ramal identifica outro ponto final — mas significa que você não pode remover os parâmetros que não entende e comparar o que sobrou.
Existe também uma regra normativa de ordem que quase nada segue. O ramal ou o subendereço RDIS vêm primeiro, depois phone-context, depois todos os outros parâmetros em ordem alfabética. O padrão dá o motivo no mesmo parágrafo: é para que uma URI tel: possa ser comparada caractere a caractere, que é como o SIP as compara. A forma canônica que esta página imprime aplica essa ordem.
Limites honestos
Isto verifica a gramática da URI e mais nada. Não faz ideia se um número existe, se o código do país é real ou quantos dígitos o plano de numeração daquele país usa — esse é outro trabalho, das bibliotecas dedicadas a números de telefone, que têm um conjunto de dados por trás, e aqui ele não é tentado de propósito. Uma URI pode ser perfeitamente conforme e ainda assim ser um número que ninguém atende.
Ele também não sabe dizer se o contexto de um número local é o certo, apenas que é um domínio ou um prefixo global sintaticamente válido. E a resposta sobre igualdade é a da RFC 3966, que trata de URIs: duas URIs diferentes podem alcançar o mesmo telefone no mundo real por um roteamento que nenhuma comparação de texto teria como conhecer.
Uma coisa que vale saber sobre a plataforma: nada disso vem de graça do navegador. Como tel não é um dos esquemas especiais do padrão de URL, new URL devolve toda a parte do assinante como um caminho opaco, não valida nada — aceita tel:555-1234 sem reclamar — e comparar dois objetos URL por href diz que tel:+1-555-0100 e tel:+15550100 são diferentes. Isso não é defeito: um analisador genérico de URI está respondendo uma pergunta genérica. Mas significa que toda afirmação desta página tem de ser calculada, não emprestada.
Por que é grátis?
É uma gramática e uma comparação de cinco regras, e o seu navegador roda as duas enquanto você digita. Nenhum servidor entra na conta, então não há nada a medir nem conta a criar.
Nada é enviado. Os números que você colar ficam nesta aba.