2012-12-05 9 views
5

Dlaczego otrzymuję same wyniki dla literałów zarówno dużych, jak i małych? Na przykład:Wartość literałów znaków Java z getNumericValue()

char ch1 = 'A'; 
char ch2 = 'a'; 
char ch3 = 'Z'; 
char ch4 = 'z'; 

print("ch1 -- > " + Integer.toBinaryString(Character.getNumericValue(ch1))); 
print("ch2 -- > " + Integer.toBinaryString(Character.getNumericValue(ch2))); 
print("ch3 -- > " + Integer.toBinaryString(Character.getNumericValue(ch3))); 
print("ch4 -- > " + Integer.toBinaryString(Character.getNumericValue(ch4))); 

Jak wynika uzyskać:

ch1 -- > 1010 
ch2 -- > 1010 
ch3 -- > 100011 
ch4 -- > 100011 

I tak naprawdę nie widzi różnicy między 'A' i 'A'. Nawet jeśli używam literałów znaków w formacie UTF (\ u0041 dla "A" i \ u0061 dla "a"), otrzymuję takie same wyniki.

Odpowiedz

7

To zachowuje się dokładnie tak, jak documented:

litery AZ w ich wielkiej ('\ u0041' przez '\ u005A'), małe litery ('\ u0061' przez '\ u007A') i pełnej szerokości wariant ('\ uFF21' do '\ uFF3A' i '\ uFF41' do '\ uFF5A') tworzy mają wartości liczbowe od 10 do 35.

Zasadniczo oznacza to, że podczas przetwarzania hex (powiedzmy) 0xfa == 0xFA, jak można się spodziewać.

Spodziewałbym się tylko, że sprawa ma znaczenie przy używaniu czegoś takiego jak base64.

+0

Po prostu usuńmy ten komentarz i zapomnijmy o tym;) –

+0

Wow, dziękuję, tęsknię za tym interesującym punktem od dokumentów. Ładne "dziwne" zachowanie, IMHO. Czego się spodziewałem, aby uzyskać "całkowitą reprezentację literału". –

+0

@DmitriyUgnichenko: Jakich rezultatów oczekiwałeś? – Dolda2000

4

Sądząc po komentarzu, w rzeczywistości poszukuje się kodowań znaków, a nie ich wartości liczbowej, więc po prostu wyizoluję to w odpowiedzi. Funkcja getNumericValue() zwraca to, co symbol oznacza jako liczbę podczas interpretowania jej glifu, nie zwraca punktu kodowego znaku. Na przykład getNumericValue('5') zwraca 5 jako int, a nie na punkt kodowy 5.

Aby korzystać z punktów kodowych, po prostu użyj zmiennych lub literałów znaków, takich jakie są. char to numeryczny typ danych. Na przykład: System.out.println((int)'a'); wydrukuje 65, po prostu.

+0

Tak, dziękuję. Właśnie tego chciałem (nawet nie wiem, dlaczego zdecydowałem się użyć tej metody getNumericValue()). Wszystko jest o wiele łatwiejsze. –

Powiązane problemy