Caratteri Speciali e Sequenze di Escape in Java
Usa le sequenze di escape Java come \n, \t, \\, \" e gli escape Unicode all'interno dei letterali stringa.
Alcuni caratteri non possono essere scritti direttamente all'interno di un letterale stringa — un " terminerebbe la stringa, un'interruzione di riga letterale spezzerebbe la riga sorgente, e la barra rovesciata ha già un compito speciale: dice al compilatore "tratta ciò che segue come un escape." Java risolve questo problema con le sequenze di escape: codici brevi, preceduti da barra rovesciata, che rappresentano quei caratteri scomodi. Un meccanismo separato, gli escape Unicode (\uXXXX), permette di scrivere qualsiasi code point nel Basic Multilingual Plane tramite il suo valore esadecimale.
Questa pagina copre le sequenze di escape standard, gli escape nei letterali char, gli escape Unicode e ottali, come i blocchi di testo rilassano le regole e gli errori più comuni in cui si incappa.
Le sequenze di escape standard
| Sequenza | Significato |
|---|---|
\n | nuova riga (LF, U+000A) |
\r | ritorno a capo (CR, U+000D) |
\t | tabulazione (U+0009) |
\b | backspace (U+0008) |
\f | avanzamento modulo (U+000C) |
\" | virgolette doppie |
\' | virgoletta singola |
\\ | una singola barra rovesciata |
\0 | carattere null (U+0000) |
\s | spazio (U+0020), aggiunto in Java 15 |
Esempi:
String multi = "Line 1\nLine 2\nLine 3";
String quoted = "She said \"hi\"";
String tabbed = "name\tage\tcity";
String path = "C:\\Users\\Ada\\code.java";Quando si stampano queste stringhe, le sequenze di escape diventano i caratteri effettivi:
Line 1
Line 2
Line 3
She said "hi"
name age city
C:\Users\Ada\code.javaAll'interno di un letterale char
Un letterale char è racchiuso tra virgolette singole. Le stesse sequenze di escape si applicano, ma le regole si invertono per le virgolette: all'interno delle virgolette singole è necessario fare l'escape di \', mentre " può essere scritto liberamente. (All'interno di una stringa tra virgolette doppie è il contrario — \" è escaped e ' è libero.)
char quote = '\''; // a single-quote character
char tab = '\t'; // a tab
char back = '\\'; // one backslash
char dquote = '"'; // no escape needed hereEscape Unicode
Per incorporare qualsiasi carattere del Basic Multilingual Plane, si usa \uXXXX dove XXXX è il code point esadecimale a 4 cifre:
String greeting = "Café"; // "Café"
String pi = "π ≈ 3.14"; // "π ≈ 3.14"
char heart = '♥'; // '♥'I code point al di fuori del BMP (la maggior parte delle emoji) richiedono una coppia surrogata — due escape \uXXXX — quindi è quasi sempre più semplice incollare direttamente il carattere.
\uXXXX in un primissimo passaggio, prima che il sorgente venga suddiviso in token. Ecco perché un (newline) spinto dentro una stringa è un errore di compilazione invece di un newline a runtime, e perché \uXXXX è valido ovunque — nei commenti, negli identificatori, persino tra gli operatori. Le escape ordinarie come \n e \t vengono interpretate solo in seguito, all'interno dei letterali stringa e char.Escape ottali
\ seguito da 1–3 cifre ottali (0–7) rappresenta il carattere con quel valore ottale:
char c = '\101'; // 'A' (decimal 65)
char d = '\14'; // form feedLi si vede raramente — gli escape Unicode sono più chiari.
I blocchi di testo raw bypassano la maggior parte degli escape
In un blocco di testo (Java 15+), è possibile scrivere letteralmente le interruzioni di riga e le virgolette doppie non escaped — perfetto per incorporare JSON, SQL o HTML. Le uniche sequenze ancora necessarie sono \\ per una barra rovesciata letterale e \uXXXX per Unicode:
String json = """
{
"name": "Ada",
"tagline": "She invented programming"
}
""";Si noti che le chiavi "name" e "tagline" non hanno bisogno di \" — si trovano all'interno di un blocco """...""".
Una dimostrazione
Errori comuni
- Scrivere
"\n"aspettandosi le terminazioni di riga di Windows.\nè solo LF. Per le interruzioni di riga corrette per la piattaforma nell'output formattato, si usa%nall'interno diprintf/format— si espande al separatore di riga dell'host. - Dimenticare di fare l'escape delle barre rovesciate nelle regex. Un pattern regex vive prima all'interno di una stringa Java, quindi passa attraverso due livelli di escape. Per corrispondere a una cifra (
\d) si scrive la stringa"\\d"— il compilatore trasforma\\in una singola barra rovesciata, e poi il motore regex legge\d. Per corrispondere a una barra rovesciata letterale ne servono quattro:"\\\\". - Usare
per incorporare una nuova riga.è il code point di newline, e poiché gli escape Unicode vengono tradotti prima che il tokenizer sia eseguito, il compilatore sostituisce un vero a capo nel mezzo del letterale stringa — il che è un errore di sintassi. Si usa\nper le nuove righe all'interno delle stringhe; si riserva\uXXXXper i caratteri stampabili. - Un escape Unicode incompleto o non valido.
\udeve essere seguito esattamente da quattro cifre esadecimali."\u12"o"\uZZZZ"è un errore di compilazione, non una barra rovesciata letterale. Se si vuole un\uletterale, bisogna fare l'escape della barra rovesciata:"\\u".
Cosa c'è dopo
Numeri in Java fornisce uno sguardo approfondito sui tipi numerici, i loro letterali e la loro precisione.