parse - ¿Cuál es la representación interna de Java para String? UTF-8 modificado UTF-16?
string encoding utf8 (6)
Busqué la representación interna de Java para String, pero tengo dos materiales que parecen confiables pero inconsistentes.
Uno es:
http://www.codeguru.com/cpp/misc/misc/multi-lingualsupport/article.php/c10451
y dice:
Java usa UTF-16 para la representación de texto interna y admite una modificación no estándar de UTF-8 para la serialización de cadenas.
El otro es:
y dice:
Tcl también usa el mismo UTF-8 modificado [25] como Java para la representación interna de datos Unicode, pero usa el CESU-8 estricto para datos externos.
UTF-8 modificado ¿O UTF-16? ¿Cuál es correcto? ¿Y cuántos bytes utiliza Java para un char en la memoria?
Por favor, hágame saber cuál es el correcto y cuántos bytes utiliza.
Java usa UTF-16 para la representación de texto interno
La representación de String and StringBuilder, etc. en Java es UTF-16
https://docs.oracle.com/javase/8/docs/technotes/guides/intl/overview.html
¿Cómo se representa el texto en la plataforma Java?
El lenguaje de programación Java se basa en el conjunto de caracteres Unicode y varias bibliotecas implementan el estándar Unicode. El tipo de datos primitivo char en el lenguaje de programación Java es un entero de 16 bits sin signo que puede representar un punto de código Unicode en el rango U + 0000 a U + FFFF, o las unidades de código de UTF-16. Los diversos tipos y clases en la plataforma Java que representan secuencias de caracteres - char [], implementaciones de java.lang.CharSequence (como la clase String) e implementaciones de java.text.CharacterIterator - son secuencias UTF-16.
En el nivel de JVM, si está utilizando -XX:+UseCompressedStrings
(que es el predeterminado para algunas actualizaciones de Java 6) La representación en memoria real puede ser de 8 bits, ISO-8859-1 pero solo para cadenas que no necesitan Codificación UTF-16.
http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html
y admite una modificación no estándar de UTF-8 para la serialización de cadenas.
Las cadenas serializadas usan UTF-8 de forma predeterminada.
¿Y cuántos bytes utiliza Java para un char en la memoria?
Una char
es siempre de dos bytes, si ignora la necesidad de relleno en un objeto.
Nota: un punto de código (que permite caracteres> 65535) puede usar uno o dos caracteres, es decir, 2 o 4 bytes.
El tamaño de un char
es de 2 bytes.
Por lo tanto, diría que Java usa UTF-16 para la representación interna de cadenas.
Java almacena cadenas internamente como UTF-16 y usa 2 bytes para cada carácter.
La representación en memoria utilizada en la matriz char del tipo String
es UTF-16. El UTF-8 modificado se usa en otros contextos; por ejemplo, en archivos ".class" y el formato de serialización de objetos.
Puede confirmar esto mirando el código fuente de la clase java.lang.String
.
ACTUALIZAR
Con Java 6 actualización 21 y posterior, hay una opción no estándar para habilitar cadenas comprimidas.
Con Java 9 y posterior, el comportamiento ha sido cambiado para usar la representación compacta para Cadenas de forma predeterminada. La documentation comando java
ahora dice esto:
-XX: -CompactStrings
Desactiva la función Cadenas compactas. Por defecto, esta opción está habilitada. Cuando esta opción está habilitada, las cadenas de Java que contienen solo caracteres de un solo byte se representan internamente y se almacenan como cadenas de un solo byte por carácter utilizando la codificación ISO-8859-1 / Latin-1. Esto reduce, en un 50%, la cantidad de espacio requerido para cadenas que contienen solo caracteres de un solo byte. Para Java Strings que contiene al menos un carácter multibyte: estos se representan y almacenan como 2 bytes por carácter utilizando la codificación UTF-16. La desactivación de la característica Cadenas compactas obliga al uso de la codificación UTF-16 como la representación interna de todas las cadenas de Java.
(Tenga en cuenta que no es la codificación UTF-8).
Ver también:
java está disponible en 18 idiomas internacionales y sigue el juego de caracteres UNICODE, que contiene todos los caracteres disponibles en 18 idiomas internacionales y contiene 65536 caracteres. Y Java siguiendo a UTF-16, por lo que el tamaño de char en java es de 2 bytes.
UTF-16.
De http://java.sun.com/javase/technologies/core/basic/intl/faq.jsp :
¿Cómo se representa el texto en la plataforma Java?
El lenguaje de programación Java se basa en el conjunto de caracteres Unicode y varias bibliotecas implementan el estándar Unicode. El tipo de datos primitivo char en el lenguaje de programación Java es un entero de 16 bits sin signo que puede representar un punto de código Unicode en el rango U + 0000 a U + FFFF, o las unidades de código de UTF-16. Los diversos tipos y clases en la plataforma Java que representan secuencias de caracteres - char [], implementaciones de java.lang.CharSequence (como la clase String) e implementaciones de java.text.CharacterIterator - son secuencias UTF-16.