2015-07-06 10 views
6

czytam z doc Java Character, żeDlaczego niektóre int od 0x0000 do 0xFFFF nie jest postacią zdefiniowane unicode

zestaw znaków z U + 0000 do U + FFFF jest czasami określane jako Podstawowy wielojęzyczny samolot (BMP)

Ale próbowałem poniższy kod i stwierdzono, że 2492 int nie jest zdefiniowany! Czy coś jest nie tak? Czy mam jakieś nieporozumienie? Dzięki!

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); 
} 

wyjściowa:

+1

Cóż, samolot ma nazwę "Basic Multilingual Plane", ale to wszystko. Pozostałe sloty znaków są zarezerwowane dla przyszłych zastosowań. –

+0

@Binkan, Thansk! Tak więc muszę sprawdzić, czy kod unicode istnieje, zanim ślepo ukryje jakiekolwiek int z tego zakresu w postaci? –

+0

Tak, oczywiście ... Z ciekawości: Co próbujesz osiągnąć tutaj? –

Odpowiedz

4

W documentation for isDefined() stwierdza, że ​​postać "definiuje się", jeśli ma wpisu lub jest w zakresie w UnicodeData file. Określa to zbiór punktów kodowych, które zostały przypisane (i może być lepiej nazwany isAssigned()). Jak odkryłeś, nie wszystkie punkty kodu w Podstawowej płaszczyźnie wielojęzycznej zostały przypisane do znaków jeszcze (this map pokazuje, gdzie niektóre z pustych miejsc są).

Jednak nawet jeśli punkt kodowy nie został przypisany (tzn. isDefined() jest false), może zostać przypisany w przyszłej wersji Unicode i nadal jest prawidłowym punktem kodowym. Kodowanie/dekodowanie i praca z nieprzypisanymi punktami kodowymi jest całkowicie poprawna (choć jest trochę dziwna).

+1

Zdecydowanie zgadzam się, że 'isAssigned()' miałoby o wiele więcej sensu, ponieważ wtedy odpowiada nazwie reprezentowanej właściwości znaku Unicode. W tej chwili tak nie jest. Istnieje również problem, że [poprawne wartości skalarne Unicode] (http://unicode.org/glossary/#unicode_scalar_value) wykluczają surogaty i kontynuuj przez 16 płaszczyzn nad BMP. Zdecydowanie wolę klasę ICU [UCharacter] (http://icu-project.org/apiref/icu4j/com/ibm/icu/lang/UCharacter.html) niż zwykłą klasę znaków Javy, ponieważ postać jest katastrofalnie niewystarczająca do pracy w Unicode w niezliczonych sposobach. – tchrist