2015-07-06 3 views
6

Ho letto dal doc Java di Character, chePerché alcuni int da 0x0000 a 0xFFFF non è un carattere Unicode definito

Il set di caratteri da U + 0000 a U + FFFF viene a volte indicato come il Basic Multilingual Plane (BMP)

Ma ho provato il seguente codice e ho trovato che 2492 non è definito! C'è qualcosa che non va? O ho qualche malinteso? Grazie!

public static void main(String[] args) 
{ 
    int count=0; 
    for(int i = 0x0000; i<0xFFFF;i++) 
    { 
     if(!Character.isDefined(i)) 
     { 
      count++; 
     } 
    } 
    System.out.println(count); 
} 

uscita:

+1

Bene, l'aereo ha il nome "Basic Plilingual Plane", ma il gioco è fatto. Il resto degli slot di caratteri sono riservati per usi futuri. –

+0

@Binkan, Thansk! Quindi ho bisogno di verificare se l'unicode esiste prima di coprire ciecamente qualsiasi int in quell'intervallo in un personaggio? –

+0

Sì, certo ... Per curiosità: cosa stai cercando di ottenere qui? –

risposta

4

Le documentation for isDefined() afferma che un personaggio "è definito" se ha una voce o si trova in un intervallo nel UnicodeData file. Questo identifica l'insieme di punti di codice che sono stati assegnati a ai caratteri (e potrebbe essere stato meglio denominato isAssigned()). Come hai scoperto, non tutti i punti di codice nel Piano multilingue multilingue sono stati assegnati ai caratteri ancora (this map mostra dove sono alcuni degli spazi vuoti).

Tuttavia, anche se non è stato assegnato un punto di codice (ovvero, isDefined() è false), può essere assegnato in una versione futura di Unicode ed è ancora un punto di codice valido. La codifica/decodifica e il funzionamento con punti di codice non assegnati sono perfettamente validi (anche se è un po 'strano).

+1

Concordo sul fatto che 'isAssigned()' avrebbe molto più senso, poiché corrisponde al nome della proprietà del carattere Unicode rappresentato. In questo momento, non è così. C'è anche il problema che [valori scalari Unicode validi] (http://unicode.org/glossary/#unicode_scalar_value) escludono i surrogati e proseguono attraverso i 16 piani sopra il BMP. Preferisco fortemente la classe ICU [UCharacter] (http://icu-project.org/apiref/icu4j/com/ibm/icu/lang/UCharacter.html) sulla normale classe di caratteri di Java, perché Character è disastrosamente carente per il lavoro Unicode in innumerevoli modi. – tchrist