2013-05-27 13 views
15

Ho bisogno di generare il codice esadecimale di caratteri Java nelle stringhe e analizzare di nuovo tali stringhe in seguito. Ho trovato here che l'analisi può essere eseguita come segue:Java Char per la sua rappresentazione di stringa esadecimale unicode e viceversa

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

speravo in qualcosa di più elegante come Integer.valueOf() per l'analisi.

Che ne dici di generare correttamente l'Unicode esadecimale?

+0

Ho inviato una risposta ma penso che potrei farlo all'indietro da quello che vuoi. Potresti chiarire con un esempio dell'output che stai cercando? – noel

+0

Dire, per carattere ö, mi piacerebbe '00F6' come elencato qui: http://en.wikipedia.org/wiki/List_of_Unicode_characters – JVerstry

+0

OK, allora la mia risposta dovrebbe funzionare. – noel

risposta

6

Dopo aver fatto qualche lettura più profonda, il javadoc dice che i metodi basati su Characterchar parametri non supportano tutti i valori Unicode, ma quei punti di codice che assumono (vale a dire, int) fanno.

Quindi, ho iniziato ad esibirmi il seguente 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); 

e sto ottenendo:

enter image description here

Pertanto, non dovrei parlare char nella mia interrogazione, ma piuttosto di matrice di caratteri, poiché i caratteri Unicode possono essere rappresentati con più di uno char. Dall'altro lato, uno int copre tutto.

+0

Bene, hai ragione a parlare di char nella tua domanda, è Java che è rotto e costringe il programmatore a intromettersi con le stringhe a livello di dettaglio della codifica da WRT a Unicode supplementare. –

13

Questo genererà una rappresentazione di stringa esadecimale del char:

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

E questo sarà convertire la stringa esadecimale di nuovo in un char:

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

Prima mi dà> Can not cast from char [] to int – Machado

+0

@Holmes Non ho avuto problemi con openjdk 1.8.0_65 e javac 1.8.0_60. O usando il precedente o 'char c = '\ u041f';' (che è П) o '\ u4e2d '(che è 中). Non ho potuto compilare con una piastrella Mahjong "(che è fuori dal piano multilingue di base, e quindi non rappresentabile da char quindi non è sorprendente). – Eponymous

5

A livello String: I seguenti usi non sono char ma int, ad esempio per il cinese, ma sono anche adeguati per i caratteri.

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

A livello native2ascii: Se si desidera convertire avanti e indietro tra \uXXXX e carattere Unicode, utilizzare da apache, commons-lang il StringEscapeUtils:

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

On la riga di comando native2ascii può convertire avanti e indietro i file tra u-escape e dire UTF-8.

Problemi correlati