O que o texto realmente é, e por que as ferramentas discordam sobre ele
Um arquivo de texto é feito de bytes mais uma codificação, e a codificação não fica guardada no arquivo. Só uma convenção diz a um programa que determinado byte significa “é” — e é por isso que o mesmo arquivo abre certo num lugar e aparece como “é” em outro. O UTF-8 é a resposta moderna e guarda as letras latinas comuns em um byte, as letras acentuadas em dois, e a maior parte do chinês, do japonês, do árabe e todos os emojis em três ou quatro. O UTF-16 é o que o Windows e o JavaScript usam internamente e guarda quase tudo em dois bytes e o resto em quatro. Windows-1252 e Latin-1 são as codificações de um byte que sistemas mais antigos ainda geram, e são a origem mais comum de caracteres embaralhados. Vale saber sobre estas páginas: o Visualizador de CSV detecta a codificação do arquivo que você solta, inclusive UTF-16 e Windows-1252, e deixa você trocá-la. As caixas de texto simples não fazem isso — um arquivo solto é lido como UTF-8, então uma exportação em Latin-1 vai mostrar as letras acentuadas erradas, e a solução é convertê-la antes.
“Caractere” tem quatro significados, e o que você precisa depende de quem está impondo o limite. O que uma pessoa vê como um caractere é um cluster de grafemas. O que uma expressão regular encontra é um code point. O que o string.length do JavaScript informa são unidades UTF-16. O que uma coluna de banco de dados ou um cabeçalho HTTP mede são bytes UTF-8. Para um texto simples em inglês, os quatro coincidem, e é por isso que ninguém percebe — até que um emoji de família é um grafema, sete code points, onze unidades UTF-16 e vinte e cinco bytes, e uma mensagem de 200 caracteres é rejeitada por um campo de 255. O Contador de caracteres mostra os quatro exatamente por esse motivo.
Caracteres invisíveis são caracteres de verdade. Um espaço não separável parece idêntico a um espaço e é um caractere totalmente diferente — ele aparece o tempo todo em textos copiados de uma página da web ou de um editor de texto, e quebra buscas, a leitura de CSV e códigos que dividem por espaços. Os zero-width joiners são o que mantém unido um emoji de várias pessoas. Hifens condicionais, marcas de direção e marcas de ordem de bytes viajam junto com o texto colado. Nenhum deles aparece na tela, então o único sinal que você tem é uma contagem que não bate com o que você vê — um uso honesto para um contador de caracteres. Observe que a opção de ignorar espaços do Comparar textos junta espaços e tabulações comuns; ela não trata um espaço não separável como espaço, porque os dois não são a mesma coisa.
As quebras de linha são o motivo pelo qual um diff às vezes mostra todas as linhas como alteradas. O Windows termina uma linha com retorno de carro e avanço de linha; todo o resto usa só o avanço de linha. Salve um arquivo LF num editor do Windows e cada linha passa a diferir por um byte invisível, então uma comparação byte a byte — git diff, diff(1) — informa o arquivo inteiro como reescrito e esconde a única mudança que você realmente fez. O nosso Comparar textos e o Remover linhas duplicadas separam as linhas pelas três convenções antes de comparar, então um arquivo que só mudou as quebras de linha não aparece aqui como uma parede vermelha. Isso é uma conveniência numa ferramenta de leitura e uma armadilha num repositório: corrija na origem, com o seu editor ou com as configurações de quebra de linha do próprio git.
Duas strings que parecem idênticas podem ser comparadas como diferentes, e a normalização costuma ser o motivo. O Unicode permite escrever “é” de duas formas: como um code point só, ou como um “e” simples seguido de um acento agudo combinante. Elas aparecem iguais na tela e são sequências de bytes diferentes, então uma comparação, uma remoção de duplicatas ou uma consulta ao banco de dados as trata como dois valores distintos. O macOS e o Windows historicamente discordam sobre qual forma usar em nomes de arquivos, e é assim que uma lista reunida de duas máquinas acaba com o que parecem duplicatas exatas que não são removidas. O Contador de caracteres é como você descobre isso — as duas formas têm a mesma contagem de grafemas e uma contagem de code points diferente. Nenhuma destas ferramentas converte entre as formas; isso é trabalho de uma linha para um script com uma biblioteca Unicode, como o unicodedata.normalize do Python.
“Contagem de palavras” é um critério, não uma medição. Dividir por espaços em branco é uma regra do inglês, e aplicá-la ao chinês, ao japonês ou ao tailandês — que não põem espaços entre as palavras — conta um artigo longo como uma palavra só. O nosso contador usa a segmentação de palavras Unicode do navegador, que sabe onde as palavras começam em qualquer escrita. As divergências que sobram são sobre hifens (“bem-vindo” é uma palavra aqui e no Word, duas em algumas ferramentas), números soltos e o que conta como frase — “Encontramos o Dr. Silva” é uma frase, e um divisor ingênuo diz que são duas. O tempo de leitura é mais uma estimativa por cima disso: 238 palavras por minuto na leitura silenciosa, tirado de uma meta-análise, e não do número redondo que passa de um blog para outro.
Quando o navegador é mesmo a ferramenta errada
Nada neste módulo é enviado ou armazenado, e é isso que torna seguro colar aqui um rascunho inédito ou um código-fonte proprietário. Isso também define o teto, e preferimos dizer onde ele fica do que deixar você descobrir no meio do trabalho.
Arquivos grandes. O texto inteiro fica na memória da aba e é reexaminado enquanto você digita. Alguns megabytes vão bem; um log de centenas de megabytes não, e um celular desiste antes de um notebook. A linha de comando não tem esse problema porque processa em streaming: grep e ripgrep buscam em arquivos maiores que a sua memória, sed e awk transformam linha por linha, e o sort com a opção unique remove duplicatas de uma lista de dezenas de milhões de linhas usando o disco. Todos são gratuitos e já vêm instalados no macOS e no Linux.
Documentos muito diferentes. O Comparar textos para em 8.000 diferenças, porque a partir daí o custo de memória do algoritmo cresce rápido o bastante para travar a aba, e um diff desse tamanho é ilegível de qualquer jeito. Duas versões do mesmo documento quase nunca chegam lá; dois documentos sem relação chegam na hora. Para revisar código, diff e git diff lidam com qualquer tamanho, e uma ferramenta de merge de três vias de verdade faz algo que esta página simplesmente não faz.
Mudar a codificação ou normalizar Unicode. Estas páginas leem e informam; não convertem entre codificações. O iconv converte entre todas as codificações que existem, o comando file tenta adivinhar qual você tem, e a normalização Unicode é uma linha de Python ou uma chamada ao uconv da ICU. Se você está consertando uma exportação com caracteres embaralhados, esse é o conjunto de ferramentas.
Qualquer coisa repetitiva. Estas ferramentas funcionam quando uma pessoa clica. Contar palavras em quatrocentos documentos, ou minificar uma pasta a cada commit, é trabalho para um script ou uma etapa de build — e, no caso da minificação, a sua ferramenta de build faz a mesma minificação, com source maps, modo watch e cache que uma caixa de colar não oferece. Esta página é para o arquivo que está na sua frente.
CSS moderno. O Minificar CSS recusa o aninhamento nativo e a sintaxe moderna de intervalos em media queries em vez de minificá-los, porque o minificador por trás dele é anterior a ambos e apaga silenciosamente o que não entende. É uma recusa honesta, não um recurso, e a solução é compilar o aninhamento antes com Sass, PostCSS ou Lightning CSS — o que a sua ferramenta de build quase certamente já faz.
Como escolher entre ferramentas parecidas
Contador de palavras vs. Contador de caracteres. A mesma contagem, com números de destaque diferentes. O Contador de palavras destaca palavras, frases, parágrafos e tempo de leitura, que é como se mede uma redação, um artigo ou um discurso. O Contador de caracteres destaca caracteres, caracteres sem espaços e bytes UTF-8, que é como se mede uma meta description, um segmento de SMS ou um campo de banco de dados. Se algo recusou o seu texto por ser longo demais, você quer o de caracteres, e especificamente a contagem de bytes.
Comparar textos vs. Remover linhas duplicadas. O comparador responde “o que mudou entre estas duas versões” e precisa de dois textos. O removedor de duplicatas trabalha com uma lista e responde “o que aparece mais de uma vez aqui”, e também mostra quais itens se repetiram e quantas vezes, ordena de forma natural para que item2 venha antes de item10, ou mantém só as linhas que apareceram exatamente uma vez. Encontrar os itens que só existem em uma de duas listas é trabalho do removedor de duplicatas, não do comparador.
Minificar HTML vs. Minificar CSS vs. Minificar JavaScript. Três linguagens, três minificadores, e uma sobreposição que vale conhecer: o minificador de HTML também minifica o CSS dentro de blocos style e o JavaScript dentro de blocos script, do mesmo jeito que as outras duas páginas. Então um único arquivo HTML precisa de uma ferramenta, não de três. Arquivos .css e .js separados precisam das próprias páginas.
Visualizador de XML vs. Formatador XML e Validador XML. O visualizador daqui mostra uma árvore recolhível para explorar, que é o que você quer quando o documento é grande e você está procurando alguma coisa. O formatador e o validador, nas ferramentas para desenvolvedores, entregam texto indentado para colar de volta num arquivo e a linha e a coluna exatas de um erro. Ler, de um lado; editar e corrigir, do outro.
Visualizador de CSV vs. abrir o arquivo no Excel. Não é uma ferramenta rival, mas é a comparação que as pessoas realmente fazem. O Excel converte ao abrir e não pergunta: um código de produto 00123 vira 123, um número de peça 5-3 vira 5 de março, um número de pedido longo vira notação científica, e uma exportação separada por ponto e vírgula de um sistema alemão cai inteira na coluna A. O visualizador mostra cada valor como texto, exatamente como está guardado, para você ver o que realmente recebeu.
Visualizar Markdown vs. Markdown para PDF. A pré-visualização serve para conferir se um README vai aparecer como o GitHub vai exibi-lo, ao vivo enquanto você digita. Markdown para PDF, nas ferramentas de documentos, serve para gerar um documento final com quebras de página. Confira aqui, publique lá.