Por que as aspas tipograficas quebram o codigo (e como corrigi-las)

As aspas curvas ficam mais bonitas do que as retas, mas corrompem silenciosamente codigo, ficheiros de configuracao e comandos de terminal. Aprenda a identifica-las e elimina-las.

O sabotador silencioso

Copia um fragmento de codigo de um post de blog, cola-o no terminal e obtem um erro cripetico. O codigo parece correto. Fica a olhar para ele dez minutos antes de notar: as aspas estao ligeiramente curvadas. Sao aspas tipograficas (tambem chamadas aspas curvas ou aspas de impressao), e quebram o codigo.

Esta e uma das fontes mais comuns de erros invisiveis para os programadores, especialmente ao copiar de:

  • Processadores de texto (Microsoft Word, Google Docs)
  • Editores de CMS (WordPress, Medium, Notion)
  • Documentos PDF
  • Alguns clientes de email
  • Texto gerado por IA formatado para leitura e nao para execucao

Aspas retas vs aspas tipograficas

Aspas retas (o que o codigo espera):

  • ', U+0027, apostrofe ASCII / aspas simples
  • ", U+0022, aspas duplas ASCII

Aspas tipograficas (o que os processadores de texto inserem):

  • ', U+2018, marca de citacao simples esquerda
  • ', U+2019, marca de citacao simples direita / apostrofe
  • ", U+201C, marca de citacao dupla esquerda
  • ", U+201D, marca de citacao dupla direita

Sao caracteres Unicode completamente diferentes. Nenhuma linguagem de programacao, shell ou formato de configuracao os trata como equivalentes aos seus correspondentes ASCII.

O que se parte

Comandos de shell, bash, zsh, PowerShell usam todos aspas ASCII para delimitar strings. As aspas tipograficas causam um erro de sintaxe ou sao tratadas como caracteres literais no argumento.

JSON, o JSON exige U+0022 (") para delimitadores e chaves de string. As aspas duplas tipograficas produzem um erro de analise em todos os parsers JSON.

Python, JavaScript, PHP, os literais de string devem usar caracteres de aspas ASCII. As aspas tipograficas causam um SyntaxError.

Ficheiros de configuracao, YAML, TOML, ficheiros .env, configuracao SSH, todos esperam ASCII.

CSS, os nomes de fontes e seletores de atributos entre aspas devem usar ASCII.

De onde vem as aspas tipograficas

A maioria dos processadores de texto aplica "autocorrecao" que substitui as aspas retas por curvas enquanto escreve. Isto torna a prosa mais correta tipograficamente, mas torna invalido qualquer codigo no documento.

Quando copia texto destas fontes e cola num editor de codigo, as aspas tipograficas vem com ele. A maioria dos editores de codigo NAO as converte automaticamente, mostra-as, mas sao caracteres invalidos para fins de codigo.

Como encontrar e corrigir

Num editor de codigo

A maioria dos editores permite pesquisa por regex. O padrao [''""‛‟] corresponde a variantes comuns de aspas tipograficas. Pesquise o ficheiro e substitua pelo caracter ASCII adequado.

Com uma ferramenta de limpeza de texto

O Limpador Tipografico deste site converte todas as aspas curvas/tipograficas, reticencias (...), travessoes e outros caracteres tipograficos para os seus equivalentes ASCII com um clique. Cole o texto, limpe-o, copie de volta.

No terminal

sed -i "s/\xe2\x80\x98/'/g; s/\xe2\x80\x99/'/g; s/\xe2\x80\x9c/\"/g; s/\xe2\x80\x9d/\"/g" ficheiro.txt

Desativar a autocorrecao na origem

No Word: Ficheiro -> Opcoes -> Verificacao -> Opcoes de AutoCorrecao -> AutoFormatacao ao Escrever -> desmarcar "Substituir aspas retas por aspas tipograficas".

No Google Docs: Ferramentas -> Preferencias -> desmarcar "Usar aspas inteligentes".

O problema das reticencias

O mesmo problema aplica-se ao caracter de reticencias ... (U+2026), que e um unico caracter que parece ... (tres pontos) mas nao e equivalente em codigo. Se colar ... numa regex ou num ficheiro de configuracao que espera ..., falhara silenciosamente.

Resumo

As aspas tipograficas sao melhorias graficas concebidas para a leitura de texto, nao para escrever codigo. Sao caracteres Unicode diferentes das aspas ASCII e vao quebrar qualquer codigo, configuracao ou comando de terminal que os receba. Trabalhe sempre num editor de texto simples (VS Code, Sublime, Vim) em vez de um processador de texto quando escrever codigo, e limpe o texto colado antes de o usar.