2012-03-14 12 views
39

Ho cercato la rappresentazione interna di Java per String, ma ho due materiali che sembrano affidabili ma incoerenti.Qual è la rappresentazione interna di Java per String? Modificato UTF-8? UTF-16?

Uno è:

http://www.codeguru.com/cpp/misc/misc/multi-lingualsupport/article.php/c10451

e dice:

Java utilizza UTF-16 per la rappresentazione di testo interno e supporta una modifica non standard di UTF- 8 per la serializzazione delle stringhe.

L'altro è:

http://en.wikipedia.org/wiki/UTF-8#Modified_UTF-8

e dice:

Tcl usa anche lo stesso modificato UTF-8 [25] come Java per rappresentazione interna di dati Unicode, ma utilizza il CESU-8 per dati esterni.

Modificato UTF-8? O UTF-16? Quale è corretto? E quanti byte utilizza Java per un carattere in memoria?

Per favore fatemi sapere quale è corretto e quanti byte utilizza.

+0

http://stackoverflow.com/questions/4655250/difference-between-utf-8-and-utf-16, questo potrebbe rispondere alla tua domanda. –

+0

Ciò che Java utilizza e ciò che la JVM utilizza in memoria non deve essere lo stesso. Vedi la mia risposta. –

+1

la tua fonte principale di informazioni (ufficiali) su Java dovrebbe essere http://java.sun.com! (_dopo lo stackoverflow_) –

risposta

50

Java utilizza UTF-16 per la rappresentazione di testo interno

La rappresentazione for String e StringBuilder ecc in Java è UTF-16

http://java.sun.com/javase/technologies/core/basic/intl/faq.jsp

come il testo è rappresentato nella piattaforma Java?

Il linguaggio di programmazione Java è basato sul set di caratteri Unicode e numerose librerie implementano lo standard Unicode. Il tipo di dati di dati primitivi nel linguaggio di programmazione Java è un numero intero a 16 bit senza segno che può rappresentare un punto di codice Unicode nell'intervallo da U + 0000 a U + FFFF o le unità di codice di UTF-16. I vari tipi e classi nella piattaforma Java che rappresentano sequenze di caratteri - char [], implementazioni di java.lang.CharSequence (come la classe String) e le implementazioni di java.text.CharacterIterator - sono sequenze UTF-16.

A livello di JVM, se si utilizza -XX:+UseCompressedStrings (che è di default per alcuni aggiornamenti di Java 6) La rappresentazione reale in-memoria può essere a 8 bit, ISO-8859-1, ma solo per le stringhe che fanno non ha bisogno della codifica UTF-16.

http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html

e sostiene una modifica non standard UTF-8 per la serializzazione stringa.

Le stringhe serializzate utilizzano UTF-8 per impostazione predefinita.

E quanti byte utilizza Java per un carattere in memoria?

A char è sempre due byte, se si ignora la necessità di riempimento in un oggetto.

Nota: un punto di codice (che consente il carattere> 65535) può utilizzare uno o due caratteri, vale a dire 2 o 4 byte.

+2

Serializzazione Java (e file di classe) [utilizzare comunque CESU-8 modificato] (http://en.wikipedia.org/wiki/UTF-8#Modified_UTF-8), che è un UTF-8 modificato. – Deduplicator

+1

Nuovo URL: http://docs.oracle.com/javase/7/docs/api/java/lang/String.html –

+0

Nuovo URL: https://docs.oracle.com/javase/8/docs/api /java/lang/String.html Nota: Java 9 dovrebbe uscire l'anno prossimo. ;) –

9

La rappresentazione in memoria utilizzata nel char array del tipo String è UTF-16. L'UTF-8 modificato viene utilizzato in altri contesti; per esempio. nei file ".class" e nel formato di serializzazione dell'oggetto.

È possibile verificare ciò osservando il codice sorgente della classe java.lang.String.

UPDATE

Con Java 6 aggiornamento 21 e successivamente, c'è un'opzione non standard per consentire stringhe compressi.

Con Java 9 e versioni successive, il comportamento è stato modificato per utilizzare la rappresentazione compatta per le stringhe per impostazione predefinita. Il comando javadocumentation ora dice questo:

XX: -CompactStrings

Disabilita la funzione Compact Strings. Per impostazione predefinita, questa opzione è abilitata. Quando questa opzione è abilitata, le stringhe Java contenenti solo caratteri a byte singolo sono rappresentate internamente e memorizzate come stringhe a byte singolo per carattere utilizzando la codifica ISO-8859-1/Latin-1. Questo riduce del 50% la quantità di spazio richiesta per le stringhe contenenti solo caratteri a byte singolo. Per le stringhe Java contenenti almeno un carattere multibyte: queste sono rappresentate e memorizzate come 2 byte per carattere utilizzando la codifica UTF-16. La disattivazione della funzione Stringhe costringe l'uso della codifica UTF-16 come rappresentazione interna per tutte le stringhe Java.

(Nota che non è la codifica UTF-8.)

Vedi anche:

3

La dimensione di un char è 2 byte.

Pertanto, direi che Java utilizza UTF-16 per la rappresentazione String interna.

+1

I caratteri Unicode possono essere 4 byte in Java. – tchrist

+0

@tchrist Come? Come può un personaggio in Java essere 4 byte? –

+0

@KorayTugay I caratteri Unicode (punti di codice) sono valori compresi tra 0 e 0x10FFFF. – tchrist

10

UTF-16.

Da http://java.sun.com/javase/technologies/core/basic/intl/faq.jsp:

Come testo viene rappresentato nella piattaforma Java?

Il linguaggio di programmazione Java è basato sul set di caratteri Unicode, e diverse librerie implementano lo standard Unicode. Il primitivo tipo di dati nel linguaggio di programmazione Java è un numero intero senza segno a 16 bit che può rappresentare un punto di codice Unicode nell'intervallo da U + 0000 a U + FFFF o le unità di codice di UTF-16. I vari tipi e classi della piattaforma Java che rappresentano sequenze di caratteri - char [], implementazioni di java.lang.CharSequence (come la classe String), e implementazioni di java.text.CharacterIterator - sono UTF-16 sequenze.

-4

Java memorizza le stringhe internamente come UTF-16 e utilizza 2 byte per ogni carattere.

+10

Questa risposta è errata. Poiché Java utilizza UTF-16, ciascun carattere Unicode è di 2 byte o 4 byte. – tchrist

+0

@tchrist Come può una codifica UTF-16 finire in 4 byte? UTF-16 non ha sempre 2 byte? –

+4

@KorayTugay No, UTF-16 è o 2 byte o 4 byte. È una codifica a larghezza variabile proprio come UTF-8. Solo l'obsoleto UCS-2 è di 2 byte, ed è morto da tempo. – tchrist

-4

java è disponibile in 18 lingue internazionali e in seguito al set di caratteri UNICODE, che contiene tutti i caratteri disponibili in 18 lingue internazionali e contiene 65536 caratteri. E java dopo UTF-16 quindi la dimensione del carattere in java è 2 byte.

+2

La dimensione di un carattere Unicode in Java varia tra 2 byte e 4 byte, a seconda che ci si trovi nel piano 0 o meno. – tchrist

Problemi correlati