Homógrafos e punycode
Letras de alfabetos diferentes podem ter o mesmo desenho. Por baixo, um nome com letra fora do ASCII vira um endereço que começa com xn--.
Olhe estes dois endereços:
bancosesmaria.test
bаncosesmaria.test
Na tela são iguais. Mas o а do segundo é a letra a do alfabeto cirílico (usado no russo), não o a latino. Para o computador, cada letra é um número (um ponto de código Unicode), e esses dois são números diferentes: o a latino é U+0061, que em UTF-8 ocupa 1 byte (61); o а cirílico é U+0430, que ocupa 2 bytes (d0 b0). Endereço com letras de mesmo desenho e código diferente se chama homógrafo.
O DNS só conhece letras ASCII, algarismos e hífen. Para um nome com qualquer outro caractere funcionar, o navegador converte cada parte (rótulo) que tem caractere estranho para punycode: o prefixo xn--, as letras ASCII do rótulo na ordem, um hífen e um código que diz qual caractere entra em qual posição.
bаncosesmaria.test -> xn--bncosesmaria-x9j.test
O bncosesmaria são as letras ASCII que sobraram (o а impostor saiu), e o x9j guarda o U+0430 e a posição dele. O .test não muda, porque só tem ASCII.
Para achar a letra impostora num texto: grep -P '[^\x00-\x7F]' mostra as linhas com caractere fora do ASCII, xxd mostra os bytes, e em Python unicodedata.name(c) diz o nome de cada caractere e host.encode("idna") faz a conversão (no Node, url.domainToASCII(host)). Muitos navegadores mostram a forma xn-- na barra de endereço quando um rótulo mistura alfabetos, justamente para proteger quem olha.
Nem todo endereço parecido é homógrafo. rn no lugar de m, l no lugar de I, 0 no lugar de o, uma letra a mais ou um hífen são truques com letras ASCII comuns, e não viram xn--. Contra todos eles a defesa é a mesma: não chegue a um site pelo link de uma mensagem. Digite o endereço ou use um favorito salvo.