Originariamente inviato da Matto1992
codice:
JTextField jtf1=new JTextField("\u0062\u0069\u003A");
viene visualizzato bi: ed è giusto.
Ovvio e noto. Il compilatore Java riconosce e tratta gli escape Unicode presenti nel sorgente. E non solo nelle stringhe letterali ma .... tecnicamente in tutto il sorgente! E lo fa ad un livello più "a monte" rispetto alla tokenizzazione del sorgente secondo la grammatica Java.
Giusto per fare un esempio, si potrebbe scrivere nel sorgente:
\u0069\u0066 (a == 2) { }
che viene riconosciuto dal compilatore esattamente come
if (a == 2) { }
Originariamente inviato da Matto1992
Quando invece leggo la riga del file, la salvo su una variabile String e poi la passo settanto il testo alla JTextField mi visualizza \u0062\u0069\u003A nel campo.
Ovvio anche questo, quello che legge dal file .... è quello che viene poi visualizzato pari pari! Non c'è alcuna "interpretazione" particolare dei caratteri. Questo riconoscimento e trattamento degli escape devi farlo tu se vuoi questa cosa. Se vuoi farlo con del tuo codice, il modo più semplice e pulito per farlo è tramite l'uso delle espressioni regolari.
codice:
import java.util.regex.*;
public class UnicodeUnescape {
public static void main(String[] args) {
// array di caratteri, solo per rendere chiaro l'input!
char[] caratteri = {
'A', // "A"
'\\', '\\', // "\" (escape \\ )
'B', // "B"
'\\', 'u', '0', '0', '4', '3', // "C" (escape Unicode \u0043 )
'D' // "D"
};
String input = new String(caratteri);
System.out.println(input); // stampa A\\B\u0043D
String output = unicodeUnescape(input);
System.out.println(output); // stampa A\BCD
}
public static String unicodeUnescape(String escaped) {
Pattern p = Pattern.compile("\\\\(\\\\|u\\p{XDigit}{4})");
Matcher m = p.matcher(escaped);
StringBuffer buf = new StringBuffer();
while (m.find()) {
String group1 = m.group(1); // quello catturato da ( ) nel Pattern
if (group1.equals("\\")) {
// escape di '\'
m.appendReplacement(buf, "\\\\");
} else {
// escape Unicode
String hexStr = group1.substring(1);
int hex = Integer.parseInt(hexStr, 16);
m.appendReplacement(buf, String.valueOf((char) hex));
}
}
m.appendTail(buf);
return buf.toString();
}
}
P.S. qui sul forum non si vedono correttamente gli escape di \ . Guardate il sorgente prendendolo dal testo che quotereste in risposta.