Le virgolette curve (“ ” ‘ ’) sono caratteri Unicode diversi dalle virgolette dritte (" ') richieste dai linguaggi di programmazione e dai formati dati. I parser confrontano i code point esatti, quindi una virgoletta curva per loro è solo una lettera qualsiasi e la stringa non viene mai aperta. Sostituirle con virgolette dritte risolve subito il problema.
Sono caratteri davvero diversi
Tutto il problema sta in questa tabella:
| Carattere | Nome | Code point |
|---|---|---|
" |
Virgoletta doppia dritta | U+0022 |
| “ | Virgoletta doppia aperta | U+201C |
| ” | Virgoletta doppia chiusa | U+201D |
' |
Apostrofo dritto | U+0027 |
| ‘ | Virgoletta singola aperta | U+2018 |
| ’ | Virgoletta singola chiusa | U+2019 |
I linguaggi di programmazione, JSON, CSV e gli interpreti di shell riconoscono esattamente due di questi caratteri come delimitatori di stringa: U+0022 e U+0027. Gli altri quattro sono caratteri stampabili ordinari, nella stessa categoria di una lettera o di una virgola.
Quindi quando un parser incontra “name”, non vede una stringa tra virgolette leggermente decorative. Vede una sequenza di caratteri non delimitata che inizia con un simbolo inatteso. Il messaggio di errore dice qualcosa come unexpected token e punta a una riga che sembra del tutto corretta, perché alle dimensioni normali dei caratteri la differenza tra " e “ è di pochi pixel di curvatura.
Da dove arrivano
Quasi sempre da un software che cerca di essere utile.
- Word e Google Docs convertono le virgolette dritte in curve mentre digiti. L'opzione è attiva per impostazione predefinita e quasi nessuno se ne accorge, perché nella prosa è esattamente ciò che serve.
- I modelli di chat le producono perché hanno imparato da testi pubblicati, composti con virgolette tipografiche corrette.
- macOS applica la sostituzione intelligente a livello di sistema in molti campi di testo.
- Gli editor dei CMS e i box dei commenti applicano spesso filtri tipografici al testo inviato.
- Il copia-incolla dai PDF porta con sé ciò che ha usato l'impaginatore, e nei documenti prodotti professionalmente si tratta di virgolette curve.
Il filo comune è che il testo è passato attraverso qualcosa progettato per la lettura prima di arrivare a qualcosa progettato per il parsing. La prosa vuole virgolette tipografiche; il codice vuole byte esatti. Il problema nasce al confine.
Lo stesso vale per alcuni compagni di viaggio che vale la pena conoscere: il carattere di ellissi (…) al posto di tre punti, i trattini medi e lunghi al posto dei trattini semplici e gli spazi indivisibili al posto di quelli normali. Ognuno è un code point diverso dal carattere ASCII che imita, e ognuno rompe un parser nello stesso modo silenzioso.
Cosa si rompe, nello specifico
JSON. Ogni stringa in JSON deve usare U+0022. Una sola virgoletta curva rende il documento non valido, e poiché i parser segnalano il primo errore, un file che ne contiene decine richiede diversi giri per essere corretto a mano. Incollandolo in un formattatore e validatore JSON vedi la posizione esatta del primo colpevole.
CSV. Le regole di quoting esistono per proteggere i campi che contengono virgole. Una virgoletta curva non è un carattere di quoting, quindi un campo come “Smith, John” viene diviso alla virgola e ogni colonna successiva si sposta di una posizione. È più insidioso di un errore di sintassi perché fallisce in silenzio: ottieni un file che si importa senza lamentele ed è sbagliato.
Codice sorgente. Nella maggior parte dei linguaggi si tratta di un errore di compilazione o parsing, che almeno è evidente. Negli script di shell può andare peggio: rm –rf con un trattino medio al posto del trattino semplice non è il flag che intendevi, e gli argomenti tra virgolette curve vengono passati come testo letterale.
File di configurazione. YAML, TOML e i file .env accettano silenziosamente le virgolette curve come parte del valore. La tua API key finisce con un carattere decorativo attaccato, l'autenticazione fallisce e nulla nel log ti spiega perché.
Espressioni regolari e ricerca. Un pattern che contiene una virgoletta dritta non troverà corrispondenze in un testo con virgolette curve, quindi il trova e sostituisci restituisce silenziosamente zero risultati.
Come risolvere correttamente
Normalizza il testo. Incollalo in Convertire virgolette curve in virgolette dritte, che sostituisce tutte e quattro le varianti curve con gli equivalenti ASCII e indica quante ne ha modificate. Per l'output dell'IA in particolare, Pulire il testo di ChatGPT e IA gestisce virgolette, trattini lunghi, caratteri invisibili ed emoji in un solo passaggio.
Disattiva la causa. Se il problema si ripete, disabilita la sostituzione:
- Word: File → Opzioni → Strumenti di correzione → Opzioni correzione automatica → Formattazione automatica durante la digitazione → deseleziona "Virgolette semplici con virgolette tipografiche".
- Google Docs: Strumenti → Preferenze → deseleziona "Usa virgolette intelligenti".
- macOS: Impostazioni di Sistema → Tastiera → Input testo → Modifica → disattiva virgolette e trattini intelligenti.
Non scrivere codice in un elaboratore di testi. La vera soluzione è strutturale. Tutto ciò che è destinato a un parser va scritto in un editor di testo semplice, che non riscriverà mai i tuoi caratteri.
Attenzione alla correzione eccessiva. Non sostituire alla cieca le virgolette curve nella prosa. In un articolo o in un'email, le virgolette tipografiche sono corrette e quelle dritte stanno peggio. Normalizza al confine — quando il testo passa da un documento al codice o ai dati — non ovunque per impostazione predefinita.
Se un file continua a fallire dopo aver normalizzato le virgolette, il sospettato successivo è un carattere invisibile; consulta il riferimento sui caratteri Unicode invisibili.
Domande frequenti
Perché il mio JSON dice unexpected token anche se sembra corretto?
Quasi sempre c'è una virgoletta curva dove servirebbe una dritta. JSON richiede esattamente U+0022, e le varianti curve U+201C e U+201D per un parser sono caratteri ordinari. La differenza sullo schermo è di pochi pixel, ed è per questo che la riga sembra a posto.
Qual è la differenza tra virgolette curve e virgolette dritte?
Sono caratteri Unicode diversi. Le virgolette dritte sono U+0022 e U+0027, i caratteri ASCII che ogni parser si aspetta. Le virgolette curve sono U+2018, U+2019, U+201C e U+201D: segni tipografici che si curvano verso il testo, corretti nella prosa e non validi come delimitatori di stringa.
Come converto le virgolette curve in virgolette dritte?
Incolla il testo in uno strumento di normalizzazione come Convertire virgolette curve in virgolette dritte, che sostituisce tutte e quattro le varianti curve e ne riporta il conteggio. Con il trova e sostituisci servono quattro passaggi separati, uno per carattere, ed è per questo che spesso la conversione resta incompleta.
Perché l'importazione del mio CSV sposta le colonne?
Un campo che contiene una virgola è protetto solo se è racchiuso tra virgolette dritte. Le virgolette curve non sono caratteri di quoting, quindi il campo si divide alla virgola e ogni colonna successiva si sposta. Il fallimento è silenzioso: il file si importa senza errori ed è sbagliato.
Dovrei sempre rimuovere le virgolette curve?
No. Nella prosa sono tipografia corretta e hanno un aspetto migliore delle virgolette dritte. Normalizza solo quando il testo passa nel codice, in JSON, CSV, file di configurazione o in qualsiasi cosa che verrà analizzata da un parser invece che letta.