2013-08-22 2 views
13

Come si convertono le stringhe che rappresentano i punti di codice nel carattere appropriato?Come si convertono i codici codici unicode nella loro rappresentazione dei caratteri?

Ad esempio, voglio avere una funzione che ottiene U+00E4 e restituisce ä.

So che nella classe di caratteri ho una funzione toChars(int codePoint) che accetta un numero intero ma non esiste alcuna funzione che prenda una stringa di questo tipo.

C'è una funzione incorporata o devo eseguire qualche trasformazione sulla stringa per ottenere il numero intero che posso inviare alla funzione?

risposta

12

punti di codice sono scritti come numeri esadecimali con prefisso U+

Quindi, si può fare questo

int codepoint=Integer.parseInt(yourString.substring(2),16); 
char[] ch=Character.toChars(codepoint); 
+0

Si può ottenere un singolo carattere Java invece di una serie di char? –

+1

@ k-den Sì, con qualcosa come 'new StringBuilder(). AppendCodePoint (codepoint) .toString(). CharAt (0)', ma attenzione che i punti di codice sopra 64k avranno come risultato * due * caratteri, uno alto e uno basso coppia surrogata. Potresti preferire di lasciare il '.charAt (0)' e ottenere semplicemente il risultato come 'String'. –

4
"\u00E4" 

new String(new int[] { 0x00E4 }, 0, 1); 
+0

lo si considera come un valore letterale int. Op lo si ha come una stringa nella forma 'U + 00E4' – Anirudha

+0

@Anirudh a destra, e lo si è trattato appropriatamente. Ma mi chiedo se "" \ u00e4 "' fosse noto per essere equivalente (cioè, nel codice sorgente java). Hai +1 da me. –

+0

immagino che siano equivalenti..ma non sono sicuro di questo .. :) – Anirudha

0

questo esempio non usa char [].

// this code is Kotlin, but you can write same thing in Java 
val sb = StringBuilder() 
val cp :Int // codepoint 
when { 
    Character.isBmpCodePoint(cp) -> sb.append(cp.toChar()) 
    Character.isValidCodePoint(cp) -> { 
     sb.append(Character.highSurrogate(cp)) 
     sb.append(Character.lowSurrogate(cp)) 
    } 
    else -> sb.append('?') 
} 
0

Il modo più semplice che ho trovato finora è quello di lanciare il codice; se sei solo in attesa di un singolo carattere per codepoint, allora questo potrebbe andare bene per voi .:

int codepoint = ...; 
char c = (char)codepoint; 
-2

È possibile stamparli

s='\u0645\u0635\u0631\u064a' 
print(s) 
+0

Questo piuttosto si legge come un commento mediocre, ma non come una risposta. Non è nemmeno sintatticamente corretto! – GhostCat