English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Un bug riguardante i caratteri di escape in Java

In Java, puoi definire

char c = '\u4f60';
char m = '\u0045';
char e = '\u554a';

Tale littéral, ad esempio:

System.out.println("\u535a\u5ba2\u56ed");

Questo tipo di codice non presenterà mai problemi di codifica cinese in qualsiasi ambiente di codifica.

Ma non puoi definire un tale littéral:

char c = '\u000a';
char m = '\u0027';

Questo è perché \u000a e \u0027 sono caratteri di escape speciali, Java non fornisce alcun trattamento speciale per i caratteri di escape Unicode nei literal di stringa. Il programma li converte direttamente in caratteri secondo il loro valore [JLS 3.2].

\u000a è un LineFeed, ovvero un ritorno a capo, quindi il programma viene compilato come

char c = '";
';

Naturalmente, c'è un errore di compilazione

Un altro esempio è:

System.out.println("a\u0022.length()+\u0022b".length());   

Un'analisi molto superficiale di questo programma potrebbe far pensare che dovrebbe stampare 26, ma un'analisi più approfondita potrebbe far pensare che il programma dovrebbe stampare 16. Se esegui effettivamente il programma, scoprirai che il risultato non è né 26 né 16, ma 2.

Perché, " è il carattere di escape delle virgolette doppi, il programma finale verrà compilato come

String str = "a".length()+"b";
System.out.println(str.length()); 

Sulla base di questo caso, ho scritto un esempio, chiunque può eseguire e provare i risultati

String str = "\u0061\u0022\u002b\u0028\u006e\u0065\u0077\u0020\u006a\u0061\u0076\u0061\u002e\u0075\u0074\u0069\u006c\u002e\u0063\u006f\u006e\u0063\u0075\u0072\u0072\u0065\u006e\u0074\u002e\u0043\u0061\u006c\u006c\u0061\u0062\u006c\u0065<\u0056\u006f\u0069\u0064>\u0028\u0029\u007b\u0070\u0075\u0062\u006c\u0069\u0063\u0020\u0056\u006f\u0069\u0064\u0020\u0063\u0061\u006c\u0028\u0029\u007b\u0074\u0068\u0072\u006f\u0077\u0020\u006e\u0065\u0077\u0020\u0052\u0075\u006e\u0074\u0069\u006d\u0065\u0045\u0078\u0063\u0065\u0070\u0074\u0069\u006f\u006e\u0028\u0022\u0073\u0075\u0070\u0072\u0069\u0073\u0065\u0020\u006d\u0061\u0074\u0068\u0020\u0066\u0075\u0063\u006b\u0065\u0072\u0021\u0022\u0029\u003b\u007d\u007d\u0029\u002e\u0063\u0061\u006c\u006c\u0028\u0029\u002b\u0022";
System.out.println(str);

Questo è tutto il contenuto dell'articolo, speriamo che il contenuto di questo articolo possa aiutarti a imparare o lavorare meglio, e speriamo anche di ricevere un grande sostegno al manuale Yell!

Dichiarazione: il contenuto di questo articolo è stato tratto da Internet, il copyright è di proprietà del rispettivo autore, il contenuto è stato contribuito volontariamente dagli utenti di Internet e caricato autonomamente, il sito web non detiene i diritti di proprietà, non è stato editato manualmente e non assume responsabilità legali correlate. Se trovi contenuti sospetti di violazione del copyright, ti preghiamo di inviare una e-mail a notice#oldtoolbag.com (sostituisci # con @) per segnalare il problema e fornire prove pertinenti. Una volta verificata, il sito eliminerà immediatamente i contenuti sospetti di violazione del copyright.

Ti potrebbe interessare