4 pontos por GN⁺ 2024-04-24 | 3 comentários | Compartilhar no WhatsApp

Entendendo caracteres visualmente ambíguos em IDs

  • Caracteres visualmente ambíguos são aqueles que são difíceis de distinguir em certas fontes ou na escrita à mão
    • O/0, I/l/1/7, 5/S, 2/Z, 8/B, 6/G, 9/q/g etc. se enquadram nisso
  • Esses caracteres podem causar erros e confusão na entrada de dados
    • Por exemplo, o usuário pode ter dificuldade para diferenciar O e 0 e acabar digitando um código incorreto, gerando uma experiência ruim
  • Isso é especialmente importante em situações em que o ID é transmitido verbalmente ou precisa ser escrito à mão
    • atendimento ao cliente, código de desconto, código de rastreamento, ID de erro, ID de produto etc.

Decidindo se diferencia maiúsculas e minúsculas

  • É preciso decidir se o ID fará distinção entre letras maiúsculas e minúsculas
    • Com distinção entre maiúsculas e minúsculas e excluindo ambiguidades visuais, há 53 caracteres disponíveis
    • Sem distinção entre maiúsculas e minúsculas, há 22 caracteres disponíveis
  • Se o ID tiver 5 caracteres, a quantidade de IDs possíveis é:
    • Com distinção entre maiúsculas e minúsculas: 53^5 = 418,195,493
    • Sem distinção entre maiúsculas e minúsculas: 22^5 = 5,153,632
  • No entanto, à medida que o comprimento do ID aumenta, o número de IDs possíveis cresce exponencialmente
  • Portanto, é preciso encontrar um equilíbrio entre o comprimento do ID e a possibilidade de ambiguidade visual
  • Além disso, usar maiúsculas e minúsculas pode causar problemas inesperados em sistemas de terceiros que não diferenciam maiúsculas de minúsculas

Conjunto de caracteres visualmente claros

  • Se a prioridade for legibilidade, recomenda-se usar o seguinte conjunto de caracteres:
    • [ "a", "b", "c", "d", "e", "f", "h", "i", "j", "k", "m", "n", "o", "p", "r", "s", "t", "w", "x", "y", "3", "4"]

Considerações adicionais

  • Certas combinações de caracteres podem parecer outros caracteres (ex.: rn pode parecer m, 3 pode parecer w)
    • É melhor evitar essas combinações na etapa de geração do ID
  • Também é recomendável evitar caracteres com pronúncia semelhante (ex.: b e p)
    • Isso é especialmente importante quando o ID é transmitido verbalmente

Casos existentes

  • Crockford's Base32: decodifica caracteres ambíguos como o mesmo valor e também considera palavrões acidentais
  • Open Location Code: usa o conjunto de caracteres 23456789CFGHJMPQRVWX. Além de evitar ambiguidade visual, também busca evitar a formação de palavras em idiomas comuns. No entanto, inclui 6/G e 9/Q.

Opinião do GN⁺

  • Na geração de IDs, usabilidade e legibilidade devem ser tratadas como prioridade máxima. Isso é ainda mais importante se for frequente que o ID precise ser transmitido verbalmente ou anotado à mão.
  • É importante escolher um conjunto de caracteres que minimize a ambiguidade visual, encontrando ao mesmo tempo um equilíbrio adequado entre o comprimento do ID e o número de combinações possíveis.
  • Além disso, como podem surgir problemas inesperados ao integrar com sistemas de terceiros, a decisão sobre diferenciar ou não maiúsculas e minúsculas deve ser tomada com cuidado.
  • Também são necessárias considerações adicionais, como excluir certas combinações de caracteres na lógica de geração do ID ou evitar caracteres com pronúncia semelhante.
  • É recomendável consultar casos como Crockford's Base32 e Open Location Code para projetar o conjunto de caracteres ideal de acordo com os requisitos do projeto.

3 comentários

 
roxie 2025-01-29
 
roxie 2025-01-29

É realmente impressionante que tenham levado em conta até a pronúncia.

 
GN⁺ 2024-04-24
Comentários do Hacker News
  • Há um caso real em campo em que o uso de números de série com caracteres ambíguos em milhões de dispositivos causou grandes dificuldades para o suporte ao cliente. Foi uma experiência de pesadelo gerar variações de erros de digitação com regex e compará-las com o banco de dados para inferir o número de série real.
  • É preciso adaptar o método de codificação ao usuário. Base32 é adequado por ter um conjunto de caracteres claro e, ao transmitir verbalmente, é melhor usar representações com listas de palavras (por exemplo: "TIDE ITCH SLOW REIN RULE MOT"). Ainda assim, há armadilhas como expressões idiomáticas, homófonos e dialetos, então não crie sua própria lista de palavras.
  • Já houve um pedido de suporte inesperado por causa de um módulo de aritmética em bases arbitrárias enviado ao CPAN como brincadeira (Math::Fleximal). O motivo foi alguém ter usado em produção um código de demonstração que convertia hexadecimal em um código alfanumérico.
  • Na tela de entrada de números de série de DLC do Nintendo Switch, as teclas de caracteres ambíguos são desativadas para melhorar a UX.
  • Também se deve evitar caracteres difíceis de distinguir quando escritos à mão. Em especial, '7' e '1' são fáceis de confundir.
  • Se você usar maiúsculas e minúsculas, poderá ter surpresas depois por causa de sistemas ou protocolos que não diferenciam caixa. Existem até sistemas comerciais que não consideram isso um bug em nome da conveniência do usuário.
  • Sempre que anoto códigos de backup de 2FA em papel, sou tomado por ansiedade com certos caracteres (o/0, v/u, 5/S etc.). Para evitar isso, às vezes adiciono enfeites aos caracteres.
  • Como senha de Wi‑Fi, escolho uma palavra cotidiana ("vacation") que até uma criança da terceira série consiga soletrar corretamente.
  • O KeepassXC melhora muito a legibilidade ao usar cores diferentes para cada tipo de caractere (maiúsculas, minúsculas, números, símbolos etc.).
  • Endereços de Bitcoin usam uma codificação Base58 modificada.
  • O texto escreveu o nome da fonte Arial incorretamente como Ariel.