it-swarm.dev

Qual é a representação interna do Java para String? UTF-8 modificado? UTF-16?

Procurei na String a representação interna de Java, mas tenho dois materiais que parecem confiáveis, mas inconsistentes.

Um é:

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

e diz:

Java usa UTF-16 para a representação interna de texto e suporta uma modificação não padrão do UTF-8 para serialização de cadeias.

O outro é:

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

e diz:

Tcl também usa o mesmo UTF-8 modificado [25] que Java para representação interna de dados Unicode, mas usa CESU-8 estrito para dados externos.

UTF-8 modificado? Ou UTF-16? Qual deles está correto? E quantos bytes Java usa para um caractere na memória?

Deixe-me saber qual está correto e quantos bytes ele usa.

46
Johnny Lim

Java usa UTF-16 para a representação interna de texto

A representação para String e StringBuilder etc em Java é UTF-16

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

Como o texto é representado na plataforma Java?

A linguagem de programação Java é baseada no conjunto de caracteres Unicode, e várias bibliotecas implementam o padrão Unicode. O tipo de dados primitivo char na Java é uma linguagem de programação número inteiro de 16 bits não assinado que pode representar um ponto de código Unicode no intervalo de U + 0000 a U + FFFF ou as unidades de código de UTF-16. Os vários tipos e classes na plataforma Java que representam seqüências de caracteres - char [], implementações de Java.lang.CharSequence (como a classe String) e implementações de Java.text.CharacterIterator - são sequências UTF-16.

No nível da JVM, se você estiver usando -XX:+UseCompressedStrings (que é o padrão para algumas atualizações de Java 6)) A representação real na memória pode ser 8 bits, ISO-8859-1, mas apenas para cadeias que não precisam de UTF-16 codificação.

http://www.Oracle.com/technetwork/Java/javase/tech/vmoptions-jsp-140102.html

e suporta uma modificação não padrão do UTF-8 para serialização de string.

Seqüências serializadas usam UTF-8 por padrão.

E quantos bytes Java usa para um caractere na memória?

Um char tem sempre dois bytes, se você ignorar a necessidade de preenchimento em um Objeto.

Nota: um ponto de código (que permite o caractere> 65535) pode usar um ou dois caracteres, ou seja, 2 ou 4 bytes.

58
Peter Lawrey

Antes de Java 9 , a representação padrão na memória de um Java String é UTF-16 unidades de código mantidas em um char[]. UTF-8 modificado é usado em outros contextos; por exemplo. nos arquivos ".class" e no formato de serialização do objeto.

Você pode confirmar isso consultando o código-fonte da classe Java.lang.String.

Com Java 6 atualização 21 e posterior, havia uma opção não padrão (-XX:UseCompressedStrings) Para habilitar seqüências de caracteres compactadas. Este recurso foi removido no Java 7.

Para Java 9 e posterior , o comportamento se String foi alterado para usar uma representação compacta para Strings por padrão. O comando Javadocumentation agora diz o seguinte:

-XX: -CompactStrings

Desativa o recurso Compact Strings. Por padrão, esta opção está ativada. Quando esta opção está ativada, Java Strings contendo apenas caracteres de byte único são representadas e armazenadas internamente como Strings de byte único por caractere usando a codificação ISO-8859-1/Latin-1. Isso reduz em 50% a quantidade de espaço necessário para cadeias contendo apenas caracteres de byte único. Para Java Strings contendo pelo menos um caractere multibyte: são representados e armazenados como 2 bytes por caractere usando a codificação UTF-16. Desativar o recurso Compact Strings força o uso da codificação UTF-16 como representação interna para todas as Java Strings.

Observe que nem as cadeias "compactadas" ou "compactas" usavam/usam codificação UTF-8.

Veja também:

18
Stephen C

UTF-16.

From http://Java.Sun.com/javase/technologies/core/basic/intl/faq.jsp :

Como o texto é representado na plataforma Java?

A linguagem de programação Java é baseada no conjunto de caracteres Unicode, e várias bibliotecas implementam o padrão Unicode. O tipo de dados primitivo char na Java é uma linguagem de programação número inteiro de 16 bits não assinado que pode representar um ponto de código Unicode no intervalo de U + 0000 a U + FFFF ou as unidades de código de UTF-16. Os vários tipos e classes na plataforma Java que representam seqüências de caracteres - char [], implementações de Java.lang.CharSequence (como a classe String) e implementações de Java.text.CharacterIterator - são sequências UTF-16.

12
Andreas Johansson

O tamanho de um char é de 2 bytes.

Portanto, eu diria que Java usa UTF-16 para representação interna de String.

3
belgther