new Set() não acha duplicata com acento — errou 9 das 18 capitais do Brasil
Cole a lista de capitais duas vezes — uma como qualquer site do governo publica, outra como um Mac às vezes exporta — e mande um concorrente real remover as duplicadas. Ele devolve 27 linhas, não 18: São Paulo sobra duas vezes, e ele nunca vai contar que são a mesma cidade.
As 18 capitais, coladas duas vezes cada
As 9 primeiras linhas de cada bloco têm acento ou cedilha; as outras 9 não têm, e servem de controle. O texto colado é as 18 na forma que o IBGE publica, seguidas das MESMAS 18, na mesma ordem, decompostas em NFD — rodado pelos dois algoritmos reais.
| Capital | Tem acento? | Sobra 2× no new Set()? |
|---|---|---|
| São Paulo (SP) | sim | sim |
| Belém (PA) | sim | sim |
| Brasília (DF) | sim | sim |
| Vitória (ES) | sim | sim |
| Goiânia (GO) | sim | sim |
| Cuiabá (MT) | sim | sim |
| João Pessoa (PB) | sim | sim |
| Maceió (AL) | sim | sim |
| Florianópolis (SC) | sim | sim |
| Salvador (BA) | não | não |
| Recife (PE) | não | não |
| Manaus (AM) | não | não |
| Fortaleza (CE) | não | não |
| Curitiba (PR) | não | não |
| Natal (RN) | não | não |
| Teresina (PI) | não | não |
| Porto Alegre (RS) | não | não |
| Belo Horizonte (MG) | não | não |
As duas colunas concordam ponto a ponto: toda capital com acento sobra duas vezes no resultado do concorrente, e nenhuma sem acento sobra. Nesta ferramenta, as 18 voltam uma de cada, com 9 delas marcadas só parecia igual. Conferido em 13 de agosto de 2026.
O código do concorrente, lido na origem
Não é suposição sobre como um site desses costuma funcionar — é o código de verdade. Em 2026-08-13, invertexto.com/remover-linhas-duplicadas foi baixada com curl, sem login, sem nada escondido: é a mesma página que qualquer visitante recebe. O <script> inline dela, sem minificação, tem esta função:
function run(){
$('#process').click(function(){
const text = $('#origem').val();
let lines = text.split('\n');
// Use a Set to keep only unique lines
let uniqueLines = new Set(lines);
// Convert back to array
uniqueLines = Array.from(uniqueLines);
let removedLines = lines.length - uniqueLines.length;
$('#destino').val(uniqueLines.join('\n'));
...
});
}A linha que decide tudo é new Set(lines). Sem trim, sem toLowerCase, sem normalize. Duas strings do JavaScript só caem no mesmo Set quando são exatamente a mesma sequência de pontos de código — e “São Paulo” gravado com o ã como uma letra só (NFC) e “São Paulo” gravado com o a e o til como dois caracteres separados (NFD) são duas sequências diferentes, mesmo desenhando o mesmo “ã” na tela.
De onde vem o NFD, e por que ninguém escolheu isso
Ninguém digita um acento separado de propósito. O NFD aparece porque algum sistema no caminho da lista o escolheu por baixo dos panos — o mais comum é o Finder do macOS, que GRAVA nome de arquivo em NFD por decisão da Apple, documentada no FAQ técnico do APFS, e já citada em o artigo desta casa sobre quando tirar acento. Uma planilha exportada de um Mac, uma lista de nomes de arquivo colada aqui, um texto que passou por um sistema mais antigo — todos esses caminhos entregam NFD sem avisar, e a linha continua parecendo perfeitamente normal na tela.
18 capitais, sem escolher a dedo
A lista de capitais de estado é fechada — não há como escolher só as convenientes. Das 18, exatamente 9 têm acento ou cedilha na grafia oficial: São Paulo, Belém, Brasília, Vitória, Goiânia, Cuiabá, João Pessoa, Maceió e Florianópolis. Coladas duas vezes cada (a forma publicada e a forma decomposta), new Set() devolve 27 linhas de 36 — as 9 sem acento colapsam certinho, uma de cada, e as 9 com acento sobram em dobro, todas.
A magnitude: 5.298 nomes de cidade, não 18
Dezoito capitais provam que o defeito existe. Para saber o tamanho dele, medimos no catálogo inteiro do IBGE — os mesmos 5.571 municípios que o artigo de acentos e o artigo de ordem alfabética já carregaram. Tirando os 273 nomes que se repetem entre estados (“Água Branca” é cidade real em três deles, e não é o defeito que este artigo mede), sobram 5.298 nomes distintos — 2.299 deles (43,4%) têm forma NFD diferente da forma publicada.
Colando cada um dos 5.298 duas vezes — a forma publicada e a forma decomposta — new Set() processa 10.596 linhas e devolve 7.597, não 5.298. A diferença — 2.299 linhas — é exatamente 2.299 pares de cidade que ele nunca vai reconhecer como duplicata, porque cada par sobra como duas linhas em vez de colapsar numa só.
Este número (2.299 de 5.298, 43,4%) não contradiz o 2.385 (42,8%) já publicado no artigo de acentos — aquele conta sobre o catálogo INTEIRO, com os 273 homônimos repetidos; este conta sobre nomes distintos, porque duas cidades reais de estados diferentes com o mesmo nome não têm nada a ver com NFC ou NFD.
Por que esta ferramenta não erra o mesmo jeito
A ferramenta desta casa compõe cada linha em NFC antes de comparar — a mesma operação que desfaz o que o Finder fez, e a mesma que o removedor de acentos já usa para o problema irmão. Não é escolha nova para este artigo: é o motivo de existir o campo soPareciaIgual no relatório da ferramenta, publicado desde que ela foi ao ar. Rodando as mesmas 18 capitais duas vezes por ela, as 18 voltam uma de cada, e 9 aparecem marcadas no relatório como duplicata que só parecia igual — nunca uma que “sumiu” calada.
Onde isso morde de verdade
Lista de cidade não é o caso raro: é planilha de entrega, base de cliente, cadastro de fornecedor, formulário de pesquisa — qualquer coisa que junte um endereço digitado num site com um nome colado de um arquivo exportado. Duas linhas “São Paulo” que não colapsam viram duas linhas na exportação, duas contagens na análise, dois registros que uma auditoria vai perguntar por que existem. O defeito não avisa: a lista continua com cara de limpa.
O que este artigo não mede
Não testamos o comportamento do Excel nem do Google Sheets — a documentação pública dos dois não descreve com precisão como cada um compara texto ao remover duplicata, e este site não afirma o que não conferiu na origem; a página desta ferramenta já traz essa comparação, e este artigo não a repete. Tentamos ler o código de mais quatro concorrentes brasileiros desta busca (site112.com, devtools.com.br, miniwebtool.com, i2text.com): a lógica deles roda atrás de um endpoint de servidor ou de um arquivo JavaScript que o navegador busca sob demanda, não dentro do HTML nem de um `<script>` inline — e por isso não pôde ser lida do mesmo jeito que a do invertexto.com. O que este artigo afirma sobre concorrente vale só para o único cujo código foi lido de ponta a ponta.
O catálogo tem data: baixado de servicodados.ibge.gov.br/api/v1/localidades/municipios em 13 de agosto de 2026. O código do concorrente também: um site pode mudar a implementação a qualquer momento, e o que este artigo cita é o que estava no ar naquele dia.