2013-05-27 8 views
15

Potrzebuję wygenerować kod szesnastkowy znaków Java do ciągów i przeanalizować te łańcuchy ponownie później. Znalazłem here że parsowania można przeprowadzić w sposób następujący:Java Char do reprezentacji szesnastkowych ciągów znaków Unicode i vice versa

char c = "\u041f".toCharArray()[0]; 

Miałem nadzieję na coś bardziej eleganckiego jak Integer.valueOf() do parsowania.

Jak poprawnie wygenerować szesnastkowy kod Unicode?

+0

Wysłałem odpowiedź, ale myślę, że robię to od tyłu, od tego, co chcesz. Czy możesz wyjaśnić na przykładzie wyników, których szukasz? – noel

+0

Powiedzmy, dla znaku ö, chciałbym "00F6" jak tutaj: http://en.wikipedia.org/wiki/List_of_Unicode_characters – JVerstry

+0

OK, wtedy moja odpowiedź powinna zadziałać. – noel

Odpowiedz

6

Po jakiejś głębszej czytaniu javadoc mówi Character metody oparte na char parametrów nie obsługują wszystkie wartości Unicode, ale te biorące punkty kodowe (tj int) zrobić.

Dlatego byłem wykonując następujący test:

int codePointCopyright = Integer.parseInt("00A9", 16); 

    System.out.println(Integer.toHexString(codePointCopyright)); 
    System.out.println(Character.isValidCodePoint(codePointCopyright)); 

    char[] toChars = Character.toChars(codePointCopyright); 
    System.out.println(toChars); 

    System.out.println(); 

    int codePointAsian = Integer.parseInt("20011", 16); 

    System.out.println(Integer.toHexString(codePointAsian)); 
    System.out.println(Character.isValidCodePoint(codePointAsian)); 

    char[] toCharsAsian = Character.toChars(codePointAsian); 
    System.out.println(toCharsAsian); 

i otrzymuję:

enter image description here

Dlatego nie należy mówić o char na moje pytanie, ale raczej o tablica znaków, ponieważ znaki Unicode mogą być reprezentowane przez więcej niż jeden znak char. Z drugiej strony, int obejmuje to wszystko.

+0

Cóż, masz rację, mówiąc o char w twoim pytaniu, to Java jest uszkodzona i zmusza programistę do mieszania się z łańcuchami na poziomie szczegółów kodowania WRT do uzupełnienia Unicode. –

13

To wygeneruje reprezentację hex ciąg char:

char ch = 'ö'; 
String hex = String.format("%04x", (int) ch); 

I to będzie przekonwertować ciąg szesnastkowy powrotem do char:

int hexToInt = Integer.parseInt(hex, 16); 
char intToChar = (char)hexToInt; 
+0

Pierwsza daje mi> Nie można rzutować z char [] na int – Machado

+0

@Holmes Nie miałem problemu z używaniem openjdk 1.8.0_65 i javac 1.8.0_60. Albo używając powyższego albo 'char c = '\ u041f';' (który jest П) lub '\ u4e2d '(który jest 中). Nie mogłem skompilować się z płytką Mahjonga "(która jest poza podstawową płaszczyzną wielojęzyczną, a zatem nie jest reprezentowana przez char, więc nie jest to zaskakujące). – Eponymous

5

Na poziomie wyrażenie: Poniższe zastosowania nie char, ale int, na przykład dla chińskiego, ale jest również odpowiednie dla znaków.

int cp = "\u041f".codePointAt(0); 
    String s = new String(Character.toChars(cp)); 

Na poziomie native2ascii: Jeśli chcesz przekonwertować iz powrotem między \uXXXX i znak Unicode, należy od apache, commons-langStringEscapeUtils:

String t = StringEscapeUtils.escapeJava(s + "ö"); 
    System.out.println(t); 

On wiersza poleceń native2ascii może konwertować pliki w przód i w tył między u-escaped i powiedzieć UTF-8.

Powiązane problemy