Qual è la rappresentazione interna di Java per String? Modificato UTF-8? UTF-16?

Ho cercato la rappresentazione interna di Java per String, ma ho due materiali che sembrano affidabili ma incoerenti.

Uno è:

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

e dice:

Java utilizza UTF-16 per la rappresentazione del 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 utilizza anche lo stesso UTF-8 modificato [25] come Java per la rappresentazione interna dei dati Unicode, ma utilizza il CESU-8 per i 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.

Java usa UTF-16 per la rappresentazione del testo interno

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

https://docs.oracle.com/javase/8/docs/technotes/guides/intl/overview.html

Come viene rappresentato il testo nella piattaforma Java?

Il linguaggio di programmazione Java è basato sul set di caratteri Unicode e diverse 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 class String) e le implementazioni di java.text.CharacterIterator – sono sequenze UTF-16.

A livello JVM, se si utilizza -XX:+UseCompressedStrings (che è l’impostazione predefinita per alcuni aggiornamenti di Java 6) L’effettiva rappresentazione in memoria può essere 8-bit, ISO-8859-1 ma solo per stringhe che non richiedono Codifica UTF-16.

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

e supporta una modifica non standard di UTF-8 per la serializzazione delle stringhe.

Le stringhe serializzate utilizzano UTF-8 per impostazione predefinita.

E quanti byte utilizza Java per un carattere in memoria?

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

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

UTF-16.

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

Come viene rappresentato il testo nella piattaforma Java?

Il linguaggio di programmazione Java è basato sul set di caratteri Unicode e diverse 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 class String) e le implementazioni di java.text.CharacterIterator – sono sequenze UTF-16.

La rappresentazione in memoria utilizzata nell’array di caratteri del tipo String è UTF-16. L’UTF-8 modificato viene utilizzato in altri contesti; ad esempio nei file “.class” e nel formato di serializzazione dell’object.

Puoi confermarlo guardando il codice sorgente della class java.lang.String .

AGGIORNARE

Con l’aggiornamento 21 di Java 6 e versioni successive, è disponibile un’opzione non standard per abilitare le stringhe compresse.

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

XX: -CompactStrings

Disabilita la funzione Stringhe compatte. 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 distriggerszione 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.)

Guarda anche:

  • Piattaforma Java, edizione standard Novità di Oracle JDK 9
  • JEP 254: stringhe compatte

La dimensione di un char è 2 byte.

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

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

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