Aspas curvas (“ ” ‘ ’) são caracteres Unicode diferentes das aspas retas (" ') que linguagens de programação e formatos de dados exigem. Os analisadores comparam pontos de código exatos, então uma aspa curva é apenas uma letra comum para eles, e a string nunca é aberta. Substituí-las por aspas retas resolve o problema na hora.
São caracteres genuinamente diferentes
Todo o problema cabe em uma tabela:
| Caractere | Nome | Ponto de código |
|---|---|---|
" |
Aspas duplas retas | U+0022 |
| “ | Aspas duplas de abertura | U+201C |
| ” | Aspas duplas de fechamento | U+201D |
' |
Apóstrofo reto | U+0027 |
| ‘ | Aspas simples de abertura | U+2018 |
| ’ | Aspas simples de fechamento | U+2019 |
Linguagens de programação, JSON, CSV e interpretadores de shell reconhecem exatamente dois desses caracteres como delimitadores de string: U+0022 e U+0027. Os outros quatro são caracteres imprimíveis comuns, na mesma categoria de uma letra ou de uma vírgula.
Então, quando um analisador encontra “name”, ele não vê uma string entre aspas com aspas um pouco decoradas. Ele vê uma sequência de caracteres sem aspas que começa com um símbolo inesperado. A mensagem de erro diz algo como unexpected token e aponta para uma linha que parece completamente correta, porque em tamanhos normais de fonte a diferença entre " e “ são alguns pixels de curvatura.
De onde elas vêm
Quase sempre de um software tentando ajudar.
- Word e Google Docs convertem aspas retas em curvas enquanto você digita. Isso vem ativado por padrão e a maioria das pessoas nunca percebe, porque em prosa é exatamente o que se quer.
- Modelos de chat as produzem porque aprenderam com textos publicados, que são diagramados com aspas tipográficas corretas.
- macOS aplica a substituição inteligente em todo o sistema em muitos campos de texto.
- Editores de CMS e caixas de comentários costumam aplicar filtros tipográficos ao texto enviado.
- Copiar e colar de PDF carrega o que o diagramador usou, que em qualquer documento produzido profissionalmente são aspas curvas.
O ponto em comum é que o texto passou por algo feito para leitura a caminho de algo feito para análise. Prosa quer aspas tipográficas; código quer bytes exatos. O problema acontece na fronteira entre os dois.
O mesmo vale para alguns companheiros que vale conhecer: o caractere de reticências (…) em vez de três pontos, travessões em vez de hífens e espaços incondicionais em vez de espaços comuns. Cada um é um ponto de código diferente do caractere ASCII que se parece com ele, e cada um quebra um analisador da mesma forma silenciosa.
O que quebra, especificamente
JSON. Toda string em JSON precisa usar U+0022. Uma única aspa curva torna o documento inválido e, como os analisadores relatam a primeira falha, um arquivo com dezenas delas exige várias rodadas de correção manual. Colar em um formatador e validador de JSON mostra a posição exata da primeira ocorrência.
CSV. As regras de aspas existem para proteger campos que contêm vírgulas. Uma aspa curva não é um caractere de aspas, então um campo como “Smith, John” é dividido na vírgula e todas as colunas seguintes deslocam uma posição. Esse caso é pior que um erro de sintaxe porque falha silenciosamente — você obtém um arquivo que importa sem reclamação e está errado.
Código-fonte. Na maioria das linguagens, isso gera um erro de compilação ou de análise, o que pelo menos é evidente. Em scripts de shell pode ser pior: rm –rf com um travessão em vez de hífen não é a flag que você queria, e argumentos com aspas curvas são passados como texto literal.
Arquivos de configuração. Arquivos YAML, TOML e .env aceitam silenciosamente aspas curvas como parte do valor. Sua chave de API acaba com um caractere decorativo anexado, a autenticação falha e nada no log diz o porquê.
Expressões regulares e busca. Um padrão com aspas retas não corresponde a um texto com aspas curvas, então o localizar e substituir retorna zero resultados sem aviso.
Como corrigir da forma certa
Normalize o texto. Cole-o em Substituir aspas curvas online, que substitui as quatro variantes curvas pelos equivalentes ASCII e informa quantas foram alteradas. Para textos gerados por IA especificamente, o Limpar texto do ChatGPT e IA cuida das aspas junto com travessões, caracteres invisíveis e emojis em uma única passada.
Desative a origem. Se isso continuar acontecendo, desligue a substituição:
- Word: Arquivo → Opções → Revisão → Opções de AutoCorreção → Formatação automática ao digitar → desmarque "Aspas retas por aspas tipográficas".
- Google Docs: Ferramentas → Preferências → desmarque "Usar aspas inteligentes".
- macOS: Ajustes do Sistema → Teclado → Entrada de Texto → Editar → desative aspas e travessões inteligentes.
Não escreva código em um processador de texto. A correção de verdade é estrutural. Qualquer coisa destinada a um analisador deve ser escrita em um editor de texto simples, que nunca vai reescrever seus caracteres.
Cuidado com a correção exagerada. Não substitua aspas curvas indiscriminadamente em prosa. Em um artigo ou e-mail, aspas tipográficas são o correto e as retas ficam piores. Normalize na fronteira — quando o texto sai de um documento e entra em código ou dados — não em todo lugar por padrão.
Se um arquivo ainda falhar depois de normalizar as aspas, o próximo suspeito é um caractere invisível; veja a referência de caracteres Unicode invisíveis.
Perguntas frequentes
Por que meu JSON diz unexpected token quando parece correto?
Quase sempre é uma aspa curva onde deveria haver uma reta. JSON exige exatamente U+0022, e as variantes curvas U+201C e U+201D são caracteres comuns para um analisador. A diferença é de poucos pixels na tela, e é por isso que a linha parece correta.
Qual a diferença entre aspas curvas e aspas retas?
São caracteres Unicode diferentes. As aspas retas são U+0022 e U+0027, os caracteres ASCII que todo analisador espera. As aspas curvas são U+2018, U+2019, U+201C e U+201D — marcas tipográficas que se curvam em direção ao texto, corretas em prosa e inválidas como delimitadores de string.
Como converter aspas curvas em aspas retas?
Cole o texto em um normalizador como o Substituir aspas curvas online, que troca as quatro variantes curvas e informa a contagem. Fazer isso com localizar e substituir exige quatro passadas separadas, uma por caractere, e é por isso que a correção costuma ficar incompleta.
Por que minha importação de CSV desloca as colunas?
Um campo com vírgula só é protegido se estiver entre aspas retas. Aspas curvas não são caracteres de aspas, então o campo é dividido na vírgula e todas as colunas seguintes deslocam. Isso falha silenciosamente, gerando um arquivo que importa sem erros e está errado.
Devo sempre remover aspas curvas?
Não. Em prosa, elas são a tipografia correta e ficam melhores que as aspas retas. Normalize apenas quando o texto for para código, JSON, CSV, arquivos de configuração ou qualquer coisa que será analisada por máquina, e não lida por pessoas.