BrowserTools
Início / Codificadores / Inspetor Unicode

Inspetor Unicode

Vê cada carácter de um texto com o seu código e nome, e encontra caracteres ocultos ou parecidos.

A carregar Inspetor Unicode… Se nada acontecer, ativa o JavaScript.

Um texto que parece idêntico no ecrã pode ser muito diferente por baixo. Uma palavra copiada de um PDF pode trazer um hífen condicional, um nome de utilizador pode esconder um espaço de largura zero, um link pode trocar o a latino pelo а cirílico, e uma letra acentuada pode estar guardada como um só carácter ou como letra base mais um acento combinatório. O Inspetor Unicode divide qualquer texto nos caracteres que o leitor vê (agrupamentos de grafemas) e lista cada ponto de código dentro deles com o número U+, o nome oficial Unicode, a categoria geral e o bloco, para veres exatamente com o que estás a lidar.

Exemplos

Entrada é (one code point)
Saída U+00E9 LATIN SMALL LETTER E WITH ACUTE

Forma NFC, 2 bytes em UTF-8.

Entrada é (two code points)
Saída U+0065 + U+0301 COMBINING ACUTE ACCENT

Forma NFD: parece idêntico, mas a comparação dá diferente.

Entrada pаypal (with Cyrillic а)
Saída U+0430 CYRILLIC SMALL LETTER A

Assinalado como palavra com mistura de escritas.

Perguntas frequentes

Como encontro um espaço de largura zero no meu texto?
Cola o texto na caixa. Cada carácter invisível aparece na tabela como uma etiqueta (ZWSP para o espaço de largura zero, ZWJ, WJ, BOM, SHY, etc.) e a lista de avisos no topo conta-os. Usa o painel de limpeza para copiar uma versão sem eles.
Qual é a diferença entre carácter, ponto de código e byte?
Um ponto de código é uma entrada numerada do Unicode, como U+00E9 para é. Aquilo que o leitor vê como um carácter (um grafema) pode ser vários pontos de código: um emoji com tom de pele e um joiner pode ter quatro ou mais. Os bytes dependem da codificação: o UTF-8 usa 1 a 4 bytes por ponto de código e o UTF-16 usa 2 ou 4. Os contadores mostram tudo isto para o teu texto.
Porque é que duas cadeias que parecem iguais não coincidem?
Normalmente por causa da normalização ou de caracteres ocultos. "Café" pode estar guardado com um é pré-composto (NFC) ou com e seguido de um acento combinatório (NFD); aparecem iguais, mas a comparação dá diferente. Um espaço inseparável, um carácter de largura zero ou uma letra cirílica parecida têm o mesmo efeito. Normalizar as duas cadeias para NFC e remover os caracteres invisíveis resolve a maioria dos casos.
O que são NFC, NFD, NFKC e NFKD?
São as quatro formas de normalização Unicode. A NFC compõe os caracteres sempre que possível e é a forma recomendada para guardar texto e para a web. A NFD decompõe-nos em letras base e marcas combinatórias. As formas K (de compatibilidade) também convertem variantes parecidas numa forma simples: a ligadura fi passa a fi, o expoente ² passa a 2 e as letras de largura total passam a ASCII. As formas K perdem informação, por isso usa-as para pesquisa e comparação e não para guardar texto.
O que é um ataque de homóglifos ou de mistura de escritas?
É o uso de caracteres de outra escrita que se parecem com letras latinas, por exemplo o а cirílico (U+0430) em vez do a latino, para fazer um domínio, nome de utilizador ou nome de ficheiro falso parecer verdadeiro. O inspetor assinala qualquer palavra que misture letras latinas com cirílicas, gregas, arménias ou cherokee e mostra os pontos de código exatos, tornando a substituição evidente.
O que são caracteres de controlo bidirecional e porque são assinalados?
Caracteres como RLO (U+202E) ou RLI (U+2067) dizem ao motor de texto para mostrar o que vem a seguir da direita para a esquerda. São necessários em algum texto árabe e hebraico, mas também podem disfarçar conteúdo: um ficheiro chamado invoice, seguido de RLO e de fdp.exe, aparece como invoiceexe.pdf, e a investigação Trojan Source de 2021 mostrou que podem esconder lógica maliciosa em código-fonte. Fora de texto genuinamente da direita para a esquerda, são quase sempre um sinal de alarme.
O meu texto é enviado para algum lado?
Não. A análise corre inteiramente no teu navegador. A única coisa descarregada é a tabela de nomes Unicode, que é igual para toda a gente e vem deste site, não de terceiros.
De onde vêm os nomes dos caracteres?
Da Unicode Character Database publicada pelo Unicode Consortium sob a Unicode License, com a versão indicada no fundo da página. Os nomes dos ideogramas CJK e das sílabas Hangul são gerados pelas regras algorítmicas da própria norma. A categoria geral vem do suporte Unicode incorporado no teu navegador, por isso um carácter muito recente pode aparecer como não atribuído num navegador mais antigo.

Sobre Inspetor Unicode

A ferramenta assinala os caracteres que costumam dar problemas. Caracteres de formatação invisíveis como o espaço de largura zero, o zero-width joiner, o word joiner e a marca de ordem de bytes (BOM); controlos bidirecionais como RLO e LRI, que podem reordenar visualmente o texto e estiveram na base do ataque "Trojan Source" a código-fonte; espaços inseparáveis, finos e outros espaços invulgares que não correspondem a um espaço normal em código ou em pesquisas; letras com aspeto de espaço em branco usadas para simular nomes vazios; e palavras que misturam letras latinas com cirílicas ou gregas, o truque clássico dos homóglifos por trás de domínios de phishing. As sequências de emoji são reconhecidas, por isso os joiners dentro de 👩🏽‍💻 não são tratados como suspeitos.

Clica em qualquer linha para ver todas as representações desse ponto de código: bytes UTF-8, unidades UTF-16, entidades HTML numéricas e com nome, escapes de JavaScript, CSS e Python e a forma codificada para URL. Os contadores acima da tabela mostram o número de grafemas, pontos de código, unidades UTF-16 (o que o length de JavaScript devolve) e bytes UTF-8, o que explica porque é que uma coluna de base de dados, um SMS ou um tweet contam o teu texto de forma diferente daquilo que vês.

O painel de normalização compara as quatro formas de normalização Unicode (NFC, NFD, NFKC, NFKD) e permite copiar ou inspecionar qualquer uma delas, que é como se corrigem cadeias que parecem iguais mas falham numa comparação. Por fim, o painel de limpeza remove caracteres invisíveis e bidirecionais, troca espaços exóticos por um espaço normal, elimina caracteres de controlo perdidos e normaliza o resultado se quiseres, deixando os emoji intactos. Os nomes e blocos dos caracteres vêm da Unicode Character Database oficial, e tudo corre localmente no teu navegador.

O UTF-8 foi desenhado numa toalha de papel de um restaurante

Em setembro de 1992, Ken Thompson e Rob Pike, dos Bell Labs, não estavam satisfeitos com a codificação multibyte proposta para o novo conjunto universal de caracteres. Ao jantar, num restaurante de Nova Jérsia, Thompson esboçou um esquema melhor numa toalha de papel: o ASCII continua a ocupar um byte, nenhum byte de uma sequência multibyte pode ser confundido com um carácter ASCII, e é sempre possível encontrar o início de um carácter olhando para os bits mais altos. Implementaram-no no sistema operativo Plan 9 em poucos dias.

Esse desenho é o UTF-8, e a compatibilidade com o ASCII é a razão pela qual dominou a web, onde a grande maioria das páginas o usa hoje. O próprio Unicode tinha começado alguns anos antes, com a proposta de Joe Becker de 1988 para um conjunto de caracteres "Unicode" e a primeira versão da norma publicada em 1991.

A flexibilidade que tornou o Unicode universal também criou novos problemas de segurança. Em 2017, um investigador registou um domínio escrito só com letras cirílicas que os navegadores mostravam como apple.com, o que levou os navegadores a apresentar esses nomes na forma punycode. Em 2021, o artigo Trojan Source da Universidade de Cambridge mostrou que os caracteres de controlo bidirecional podiam fazer o código-fonte aparecer de forma diferente daquela que o compilador lê.

Apoiar