W3docs

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

SequenzaSignificato
\nnuova riga (LF, U+000A)
\rritorno a capo (CR, U+000D)
\ttabulazione (U+0009)
\bbackspace (U+0008)
\favanzamento modulo (U+000C)
\"virgolette doppie
\'virgoletta singola
\\una singola barra rovesciata
\0carattere null (U+0000)
\sspazio (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.java

All'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 here

Escape 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.

Nota
Gli escape Unicode differiscono da tutte le altre sequenze di escape: il compilatore traduce \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 feed

Li 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

java— editable, runs on the server

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 %n all'interno di printf / 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 \n per le nuove righe all'interno delle stringhe; si riserva \uXXXX per i caratteri stampabili.
  • Un escape Unicode incompleto o non valido. \u deve essere seguito esattamente da quattro cifre esadecimali. "\u12" o "\uZZZZ" è un errore di compilazione, non una barra rovesciata letterale. Se si vuole un \u letterale, 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.

Pratica

Pratica
Quale sequenza di escape rappresenta una singola barra rovesciata all'interno di un letterale stringa?
Quale sequenza di escape rappresenta una singola barra rovesciata all'interno di un letterale stringa?
Was this page helpful?