2010-01-05 15 views

Odpowiedz

87

Wystarczy przekształcić go int:

char registered = '®'; 
int code = (int) registered; 

W rzeczywistości istnieje niejawna konwersja z char do int więc nie trzeba określić go jednoznacznie jako Zrobiłem powyżej, ale chciałbym to zrobić w w tym przypadku, aby było oczywiste, co próbujesz zrobić.

To da jednostce kodowej UTF-16 - która jest taka sama jak kod kodowy Unicode dla dowolnego znaku zdefiniowanego w Podstawowej płaszczyźnie wielojęzycznej. (I tylko znaki BMP mogą być reprezentowane w Javie jako wartości char). Jak mówi odpowiedź Andrzeja Doyle'a, jeśli chcesz, aby kod w kodzie Unicode był z dowolnego ciągu, użyj Character.codePointAt().

Po uzyskaniu kodu kodowego UTF-16 lub punktów kodu Unicode, ale są to liczby całkowite, to od Ciebie zależy, co z nimi zrobisz. Jeśli potrzebujesz reprezentacji ciągów znaków, musisz zdecydować, jaką dokładnie reprezentację chcesz uzyskać. (Na przykład, jeśli wiesz, że wartość zawsze będzie w BMP, możesz potrzebować stałej 4-cyfrowej reprezentacji heksadecymalnej z prefiksem U+, np. "U+0020" dla spacji). To jednak wykracza poza zakres tego pytania, ponieważ nie wiesz, jakie są wymagania.

+0

Czy to działa dla każdego char? – Geo

+2

@Geo: Wszystko w Podstawowym Płaszczyźnie Wielojęzycznej, tak. Nie możesz reprezentować znaków powyżej U + FFFF w jednym znaku w Javie. Ale char jest zdefiniowany jako kodek kodu UTF-16. –

+8

Działa dla każdego "znaku", który reprezentuje znak Unicode poniżej 'U + FFFF', ale nie dla każdego znaku Unicode, ponieważ' char' nie może reprezentować całego Unicode. W zależności od źródła twojego 'char', możesz potrzebować zrobić coś bardziej złożonego (i naprawdę powinno się też na to przygotować). – JaakkoK

30

Bardziej kompletnym, choć bardziej gadatliwym sposobem byłoby użycie metody Character.codePointAt. Spowoduje to obsłużenie "wysokich zastępczych" znaków, które nie mogą być reprezentowane przez jedną liczbę całkowitą w zakresie, który może reprezentować char.

W przykładzie dałeś nie jest to bezwzględnie konieczne - jeśli znak (Unicode) może się zmieścić w jednym układzie (Java) char (takie jak zmiennej lokalnej w registered) to musi mieścić się w przedziale \u0000 do \uffff i nie musisz się martwić o zastępcze pary. Ale jeśli patrzysz na potencjalnie wyższe punkty kodowe, z tablicy String/char, to wywołanie tej metody jest mądre w celu objęcia przypadków skrajnych.

Na przykład, zamiast

String input = ...; 
char fifthChar = input.charAt(4); 
int codePoint = (int)fifthChar; 

użycie

String input = ...; 
int codePoint = Character.codePointAt(input, 4); 

Nie tylko jest to nieco mniej kod w tym przypadku, ale będzie obsługiwać wykrywanie par zastępczych dla Ciebie.

0

drogi przyjacielu, Jon Skeet powiedział, że możesz znaleźć znak dziesiętny, ale nie jest to kod heksadecymalny, który powinien być wymieniony w Unicode, więc powinieneś reprezentować kody znaków poprzez HexCode nie w Deciaml.

Istnieje narzędzie o otwartym kodzie źródłowym pod adresem http://unicode.codeplex.com, które zawiera kompletne informacje na temat postaci lub obiektu.

więc lepiej jest utworzyć parser, które dają char jako parametr i powrócić ahexCode jako ciąg

public static String GetHexCode(char character) 
    { 
     return String.format("{0:X4}", GetDecimal(character)); 
    }//end 

nadzieję, że pomoże

+0

", więc powinieneś reprezentować kody znaków poprzez HexCode nie w Deciaml" - to numer. Hex vs decimal tylko wchodzi w grę, konwertując to na ciąg, i nie ma wymogu, aby w ogóle w ogóle w pytaniu. –

4

w Javie, char jest technicznie „16-bitowa liczba całkowita ", więc możesz po prostu przesłać go do int, a dostaniesz jego kod. Od Oracle:

Typ danych char to pojedynczy 16-bitowy znak Unicode. Ma on minimalną wartość "\ u0000" (lub 0) i maksymalną wartość "\ uffff" (lub 65 535 włącznie).

Możesz więc po prostu przesłać go do int.

char registered = '®'; 
System.out.println(String.format("This is an int-code: %d", (int) registered)); 
System.out.println(String.format("And this is an hexa code: %x", (int) registered)); 
+1

Działa nawet ze znakiem euro 'String.format ("% x ", (int) '€') == 0x20ac == '\ u20ac'' – ATorras

0

Dla mnie tylko „Integer.toHexString (zarejestrowany)” pracował tak jak chciałem:

char registered = '®'; 
System.out.println("Answer:"+Integer.toHexString(registered)); 

Ta odpowiedź daje tylko reprezentacje smyczkowe, co zwykle są przedstawione w tabelach. Odpowiedź Jona Skeeta wyjaśnia więcej.

+1

Jak wspomniano w komentarzach do mojej odpowiedzi, to dlatego, że" sposób w jaki chciał "miał stworzyć heksadecymalną reprezentację kodu - a nie to pytanie zadawano.Sam kod jest liczbą całkowitą; kwestia "Jak utworzyć szesnastkową reprezentację liczby całkowitej" to inna kwestia. (W przypadku punktów kodowych Unicode powinieneś także rozważyć liczbę cyfr szesnastkowych - możesz użyć 4 dla znaku BMP i 6 dla innych, zawsze 6 lub zawsze parzystego, na przykład ...) –

+0

To czyni punkt, który napisałeś. Co sprawia, że ​​myślisz, że kod jest liczbą całkowitą z definicji? Dla mnie kod jest kombinacją symboli, niekoniecznie liczb lub liczb całkowitych. Twoja odpowiedź była bardzo przydatna, ale na koniec spędziłem pół godziny, podczas gdy znalazłem, jak uzyskać kod, jak rozumiem, być może, to zaoszczędziłoby kilka minut dla innych użytkowników. –

+2

Tak definiuje Unicode. Od http://www.unicode.org/standard/principles.html: "Pojedynczy numer jest przypisany do każdego elementu kodu zdefiniowanego przez standard Unicode." Każdy z tych numerów nazywany jest punktem kodowym i, o którym mowa w tekście, jest zapisany w formie szesnastkowej po przedrostku "U +", na przykład kod punktu U + 0041 jest liczbą heksadecymalną 0041 (równą liczbie dziesiętnej 65) reprezentuje znak "A" w standardzie Unicode. " Zmieniłem swoją odpowiedź, aby wyjaśnić, dlaczego odpowiedź na pytanie "jaki jest kod dla znaku" X "" jest liczbą, a nie łańcuchem. –

Powiązane problemy