Português (Brasil)

Ferramentas para desenvolvedores · Comparação de texto

Diferenças invisíveis: espaços ininterruptos, cotações inteligentes e formulários Unicode

· Como funciona

diferença de texto Unicode depuração

Blocos de linhas visualmente semelhantes contendo formas distintas de caracteres ocultos
Ilustração vetorial original ToolAcre

Explica por que linhas que parecem iguais na tela podem diferir byte por byte, desde espaços inseparáveis ​​e aspas curvas até caracteres de largura zero e acentos decompostos, e como encontrá-los.

Duas linhas que parecem idênticas, mas são sinalizadas como alteradas — abrem com um arquivo de tradução que falha na revisão sem motivo visível

Uma linha de tradução pode ser renderizada exatamente como sua vizinha e ainda assim falhar na comparação. As fontes do navegador ocultam os limites dos pontos de código, combinam acentos e atribuem formas semelhantes a diferentes pontuações. ToolAcre compara strings JavaScript após apenas as transformações de caso ou espaço em branco selecionadas, portanto, uma linha sinalizada pode expor uma distinção textual real.

Confie na localização, não em uma suposição sobre o personagem. Copie a linha suspeita em um editor que revele pontos de código ou em um inspetor hexadecimal. A diferença informa qual linha é diferente; ele não anota a posição interna nem nomeia o valor Unicode responsável.

Espaços inseparáveis ​​e seus parentes — explica U+00A0 e outros caracteres de espaço que os processadores de texto inserem e por que um espaço simples não corresponde a eles

O espaço ininterrupto U+00A0 não é o mesmo caractere que o espaço comum U+0020. No modo normal, suas teclas de linha permanecem distintas. Em Ignorar espaços em branco, a substituição da execução de espaços em branco pode reduzir essas execuções a um espaço comum após o corte, fazendo com que algumas dessas diferenças desapareçam.

Essa opção é uma transformação correspondente, não um comando de limpeza Unicode. As linhas iguais exibidas retêm o texto original à esquerda e nenhum documento corrigido é produzido. Se um sistema de publicação exigir espaçamento ininterrupto, uma correspondência normalizada poderá ocultar uma instrução de layout intencional em vez de corrigi-la.

O modo de espaço em branco pode reduzir os espaços em branco Unicode; comparação comum preserva caracteres distintos

Apóstrofos retos e aspas diferem dos formulários tipográficos de abertura e fechamento. Ignorar maiúsculas e minúsculas não altera a pontuação e o tratamento de espaços em branco não reescreve aspas. A correção automática de um processador de texto pode, portanto, produzir uma substituição de linha completa, mesmo quando a frase é lida de forma idêntica à primeira vista.

Escolha a pontuação pretendida com base no destino. O código-fonte, as chaves de pesquisa e os formatos de dados podem exigir caracteres ASCII exatos, enquanto a cópia editorial pode preferir formas tipográficas. A comparação prova a diferença, mas não tem uma política para decidir qual lado está correto.

Caracteres direcionais e de largura zero — abrange espaços de largura zero, uniões e marcas bidirecionais que são renderizadas como se nada ainda alterasse a linha

Espaços de largura zero, uniões e marcas direcionais podem ocupar posições de string sem desenhar um glifo visível. ToolAcre renderiza a entrada usando conteúdo de texto, evitando a interpretação de HTML, mas essa renderização segura não torna visíveis os pontos de código ocultos. Eles ainda participam da igualdade de linha ordinária.

O comportamento direcional também pode tornar a ordem visual um guia pouco confiável para a ordem de armazenamento. Não copie um fragmento suspeito de direção mista em um comando ou identificador shell apenas porque parece familiar. Inspecione os pontos de código e o contexto circundante em uma ferramenta desenvolvida especificamente antes de substituir qualquer coisa.

Acentos compostos e decompostos — explica a normalização NFC versus NFD com uma letra acentuada como um ponto de código versus uma letra base mais uma marca de combinação

Um caractere acentuado pode ser representado como um ponto de código pré-composto ou como uma letra base seguida por uma marca de combinação. O repositório não contém nenhuma chamada para `normalize`, portanto, formulários de aparência canonicamente equivalente permanecem strings JavaScript diferentes e podem produzir linhas de remoção e adição.

O conjunto de testes prova que as strings Unicode idênticas correspondem e `café` difere de `cafe`; não promete comparação com reconhecimento de grafema. Este artigo, portanto, evita reivindicações sobre comparação de bytes ou equivalência completa de Unicode. O algoritmo de linha recebe strings e compara suas chaves transformadas com igualdade estrita.

Os acentos compostos e decompostos permanecem diferentes porque a ferramenta não executa nenhuma normalização Unicode

Suponha que uma linha de recurso pareça inalterada, mas esteja sinalizada. Primeiro compare com todas as opções desativadas e, em seguida, alterne apenas os espaços em branco. Se a linha ficar igual, inspecione os espaços e os espaços em branco ocultos. Se ela permanecer alterada, inspecione as cotações, combinando marcas e outros pontos de código, em vez de redigitar a linha repetidamente.

Um inspetor de personagem pode revelar U+00A0 onde era esperado um espaço comum. Substitua-o somente após confirmar a exigência do formato. No conteúdo traduzido, os espaços inseparáveis ​​podem ser convenções de pontuação deliberadas, e uma busca e substituição ampla pode danificar a tipografia correta em outros lugares.

O que isto não cobre – a comparação relata que as linhas diferem; ele não executa a normalização Unicode para você nem substitui caracteres

A diferença de texto não normaliza NFC ou NFD, identifica itens confundíveis, remove marcas de largura zero ou produz uma saída reparada. Também não compara bytes codificados. Essas são operações separadas com consequências que um comparador de linha genérico não deveria escolher silenciosamente.

Ignorar maiúsculas e minúsculas usa JavaScript `toLowerCase`, enquanto Ignorar espaços em branco corta e condensa as chaves correspondentes. Nenhuma das operações fornece agrupamento com reconhecimento de localidade ou uma revisão de segurança Unicode. Use o resultado para restringir uma investigação, não para certificar identificadores como seguros ou linguisticamente equivalentes.

Conclusão: confie na diferença em seus olhos - conclui que uma linha sinalizada é uma diferença real e mostra como a comparação de texto de ToolAcre identifica quais linhas inspecionar

Quando visão e diferença discordam, presuma que a corda merece inspeção. O algoritmo não possui modelo visual para ser enganado pelo formato da fonte; ele vê teclas de linha. Essa limitação é útil porque evita que diferenças ocultas sejam transmitidas simplesmente porque um navegador as desenha de forma semelhante.

Execute primeiro a comparação comum, registre qual opção altera o resultado e inspecione os pontos de código antes de editar. Essa trilha de evidências separa a normalização de espaços em branco da pontuação ou composição e evita o hábito destrutivo de substituir cada caractere incomum por uma aproximação ASCII.