2012-03-23 6 views
11

Come posso visualizzare un carattere Unicode sopra U + FFFF usando char in Java?char in Unicode più di U + FFFF in java?

Ho bisogno di qualcosa di simile (se fosse valido):

char u = '\u+10FFFF'; 
+1

Dai un'occhiata a [questo documento] (http://java.sun.com/developer/technicalArticles/Intl/Supplementary/). Non puoi fisicamente mettere più di 0xFFFF in un 'char'. – mpontillo

risposta

18

Non è possibile farlo con un solo char (che detiene un'unità di codice UTF-16), ma è possibile utilizzare un String :

// This represents U+10FFFF 
String x = "\udbff\udfff"; 

alternativa:

String y = new StringBuilder().appendCodePoint(0x10ffff).toString(); 

Questo è un 0.123.239,289 mila(due unità di codice UTF-16 che si combinano per formare un singolo punto di codice Unicode oltre il piano multilingue di base). Ovviamente, hai bisogno di visualizzare i tuoi dati per far fronte anche a questo ...

0

I caratteri Unicode possono richiedere più di due byte che non possono essere in generale in attesa in un carattere.

+3

Nota, un 'char' in Java è [2-byte] (http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/Character.html#MAX_VALUE). – mpontillo

2

Source

Il tipo di dati char sono basati sulla specifica Unicode originale, che definisce i caratteri come entità a 16 bit larghezza fissa. L'intervallo di punti di codice legali è ora da U + 0000 a U + 10FFFF, noto come valore scalare Unicode.

Il set di caratteri da U + 0000 a U + FFFF viene a volte indicato come Basic Plilingual Plane (BMP). I caratteri i cui punti di codice sono maggiori di U + FFFF sono chiamati caratteri supplementari. La piattaforma Java 2 utilizza la rappresentazione UTF-16 negli array di caratteri e nelle classi String e StringBuffer. In questa rappresentazione, i caratteri supplementari sono rappresentati come una coppia di valori char, il primo dall'intervallo alto-surrogati, (\ uD800- \ uDBFF), il secondo dall'intervallo di surrogati bassi (\ uDC00- \ uFFFF).

Un valore di char, quindi, rappresenta i punti di codice BPM (Basic Multilingual Plane), inclusi i punti di codice surrogato o le unità di codice della codifica UTF-16. Un valore int rappresenta tutti i punti di codice Unicode, inclusi i punti di codice supplementari. I 21 bit più bassi (meno significativi) di int sono utilizzati per rappresentare i punti di codice Unicode e gli 11 bit superiori (più significativi) devono essere zero. Salvo diversa indicazione, il comportamento rispetto a caratteri supplementari e valori char surrogati è il seguente:

  • I metodi che accettano solo un valore char non in grado di supportare i caratteri supplementari. Trattano i valori char dagli intervalli surrogati come caratteri non definiti. Ad esempio, Character.isLetter ('\ uD840') restituisce false, anche se questo valore specifico se seguito da qualsiasi valore di surrogato basso in una stringa rappresenterebbe una lettera.

  • I metodi che accettano un valore int supportano tutti i caratteri Unicode, inclusi i caratteri supplementari. Ad esempio, Character.isLetter (0x2F81A) restituisce true perché il valore del punto di codice rappresenta una lettera (un ideogramma CJK).

Nella documentazione API J2SE, Unicode punto di codice è utilizzato per valori di carattere nell'intervallo tra U + 0000 e U + 10FFFF, e un'unità di codice Unicode viene utilizzato per valori char 16 bit che sono unità di codice di la codifica UTF-16.

2

Invece di usare StringBuilder è anche possibile utilizzare una funzione di direttamente trovato nella classe di caratteri. La funzione è aiCaratt() ed ha le seguenti specifiche:

Converte il carattere specificato (Unicode punto di codice) per
sua rappresentazione UTF-16 memorizzato in un {@code char} matrice.

Quindi non c'è bisogno di sapere esattamente come le coppie di surrogati aspetto come e lavorare direttamente con il punto di codice. Un codice di esempio appare quindi come segue:

int x = 0x10FFFF; 
String y = new String(Character.toChars(ch)); 

Nota il tipo di dati per il punto di codice è int e non char.

Problemi correlati