2011-11-09 14 views
15

Come inserire un carattere Unicode supplementare (ad esempio, il codice 10400) in una stringa letterale? Ho provato a mettere una coppia di surrogati come questo:Come inserire un carattere Unicode supplementare in una stringa letterale?

String text = "TEST \uD801\uDC00"; 
System.out.println(text); 

ma non sembra funzionare.

UPDATE:

La buona notizia è, la stringa è costruito in modo corretto.
matrice Byte in UTF-8: 54 45 53 54 20 f0 90 90 80
Byte array in UTF-16: fe ff 0 54 0 45 0 53 0 54 0 20 d8 1 mb 0

Ma la cattiva la notizia è che non è stampata correttamente (nella mia scatola Fedora) e posso vedere un quadrato al posto del simbolo atteso (la mia console non supportava correttamente l'unicode).

+2

Che cosa si intende quando si dice che non sembra funzionare? Qual è il valore di 'text.charAt (5)'? – Mats

+0

Non stampa correttamente il simbolo. Potrebbe essere qualcosa con il flusso di output. – n0rm1e

+0

Credo che "una piccola scatola" sia usata per rappresentare un carattere per il quale il sistema non può visualizzare. Ciò può significare semplicemente che il carattere che viene utilizzato nel display in cui si sta tentando di visualizzare l'output non fornisce un glifo per quel carattere. – neuralmer

risposta

12

"Funziona per me", qual è esattamente il problema?

public static void main (String[] args) throws Exception { 
    int cp = 0x10400; 
    String text = "test \uD801\uDC00"; 
    System.out.println("cp: " + cp); 
    System.out.println("found: " + text.codePointAt(5)); 
    System.out.println("len: " + text.length()); 
} 

uscita:

cp: 66560 
found: 66560 
len: 7 

Nota che la lunghezza - come la maggior parte dei metodi String - si occupa di char s, non caratteri Unicode. Questo per quanto riguarda il supporto Unicode impressionante :)

Felice di codifica.

+0

'cp: 66560' ' trovato: 66560' –

+0

Grazie, sembra che ci sia qualcosa di sbagliato nel flusso di output, poiché il byte [] che ottengo da text.getBytes() ha ragione. – n0rm1e

+2

@ houman001 Ricordati di * sempre * - tranne in quei casi che ora conosco;) - specifica una codifica con 'getBytes' :) Esci" codifica questa stringa in una sequenza di byte ** utilizzando il set di caratteri predefinito della piattaforma **". Prese simili per 'new String (byte [])'. Se viene utilizzata la codifica corretta (specificata o meno), l'output inviato allo stream deve essere corretto: ma il programma (o il terminale) sull'altro lato potrebbe non essere d'accordo. –

4

si suppone di lavorare con:

System.out.println(
    "text = " + new String(Character.toChars(h)) 
); 

Ma l'output è:

text = ? 
+2

Supponendo che h sia corretta: 'Sistema.out' codifica i dati nel set di caratteri predefinito del sistema (può trattarsi di una conversione con perdita); il dispositivo al quale si sta scrivendo deve utilizzare lo stesso set di caratteri (non sempre il caso); il dispositivo deve avere il supporto dei font per il grapheme che si desidera visualizzare. – McDowell

+3

Senza contare che se stiamo parlando della console di Windows: quando si accede usando le funzioni stdio come fa Java, è rotto e non può far fronte a caratteri al di fuori della pagina di codici ANSI (per non parlare dei personaggi dei piani astrali) . – bobince

Problemi correlati