2012-08-29 22 views
13
public class UTF8 { 
    public static void main(String[] args){ 
     String s = "ヨ"; //0xFF6E 
     System.out.println(s.getBytes().length);//length of the string 
     System.out.println(s.charAt(0));//first character in the string 
    } 
} 

uscita:java utf8 codifica - char, i tipi di stringa

3 
ヨ 

Ti prego, aiutami a capire questo. Cercando di capire come funziona la codifica utf8 in java. Come per la definizione java doc di char char: il tipo di dati char è un singolo carattere Unicode a 16 bit.

Significa che il tipo di carattere in java può supportare solo quei caratteri unicode che possono essere rappresentati con 2 byte e non più di quello?

Nel programma precedente, il numero di byte allocati per quella stringa è 3 ma nella terza riga che restituisce il primo carattere (2 byte in java) può contenere un carattere lungo 3 byte? davvero confuso qui?

Qualsiasi buon riferimento a questo concetto in java/general sarebbe molto apprezzato.

+0

Vedere anche [Domande frequenti su Unicode] (http://www.unicode.org/faq/utf_bom.html#gen0). – McDowell

risposta

27

Nulla nell'esempio di codice utilizza direttamente UTF-8. Le stringhe Java sono codificate in memoria usando invece UTF-16. I codepoint Unicode che non rientrano in un singolo char a 16 bit verranno codificati utilizzando una coppia di 2 char denominata surrogata.

Se non si passa un valore di parametro a String.getBytes(), viene restituito un array di byte con i contenuti String codificati utilizzando il set di caratteri predefinito del sistema operativo sottostante. Se si desidera garantire un array con codifica UTF-8, è necessario utilizzare invece getBytes("UTF-8").

La chiamata String.charAt() restituisce un char codificato in UTF-16 originale solo dalla memoria in memoria della stringa.

Quindi nel tuo esempio, il carattere Unicode è memorizzato nella memoria String in memoria utilizzando due byte che sono UTF-16 codificato (0x6E 0xFF o 0xFF 0x6E seconda endian), ma viene memorizzato nella matrice di byte da getBytes() usando tre byte codificati usando qualunque sia il set di caratteri predefinito del sistema operativo.

In UTF-8, anche quel particolare carattere Unicode utilizza 3 byte (0xEF 0xBD 0xAE).

+0

Suppongo che la sua codifica predefinita di sistema sia UTF-8 –

3

UTF-8 è una codifica a lunghezza variabile, che utilizza solo un byte per i caratteri ASCII (valori compresi tra 0 e 127) e due, tre (o anche più) byte per altri simboli Unicode.

Questo perché il bit più alto del byte viene utilizzato per indicare "questa è una sequenza multi-byte", quindi un bit su 8 non viene utilizzato per rappresentare effettivamente dati "reali" (il codice char) ma per contrassegnare il byte.

Quindi, nonostante Java utilizzi 2 byte in ram per ogni char, quando i caratteri sono "serializzati" utilizzando UTF-8, possono produrre uno, due o tre byte nell'array di byte risultante, ecco come la codifica UTF-8 lavori.

+0

UTF-8 utilizza un massimo di 2 byte – adosaiguas

+3

UTF-8 utilizza un massimo di 4 byte, non 2 byte (6 byte se si considerano le più vecchie specifiche UTF-8 prima che UTF-8 fosse modificato per non superare i codepoint che UTF-16 supporta). –

+0

@adosaiguas "UTF-8 codifica ciascuno dei punti di codice 1,112,064 [7] nel set di caratteri Unicode utilizzando da uno a quattro byte da 8 bit" (wikipedia) –

4

String.getBytes() restituisce i byte che utilizzano la codifica dei caratteri di default della piattaforma che non è così necessaria rappresentazione interna partita.

Si consiglia di non utilizzare mai questo metodo nella maggior parte dei casi, perché nella maggior parte dei casi non ha senso affidarsi alla codifica predefinita della piattaforma. Utilizzare invece String.getBytes(String charsetName) e specificare esplicitamente il set di caratteri da utilizzare per la codifica della stringa in byte.