manejo - ¿Cuál es la codificación de caracteres de String en Java?
que es string en java (4)
De hecho, estoy confundido con respecto a la codificación de cadenas en Java. Tengo un par de preguntas. Por favor, ayúdame si conoces la respuesta:
1) ¿Cuál es la codificación nativa de las cadenas de Java en la memoria? Cuando escribo String a = "Hello"
en qué formato se almacenará? Como Java es independiente de la máquina, no creo que el sistema haga la codificación.
2) Leí en la red que "UTF-16" es la codificación predeterminada, pero me confundí porque cuando escribo que int a = ''c''
obtengo el número del carácter en la tabla ASCII. Entonces, ¿son ASCII y UTF-16 lo mismo?
3) Tampoco estaba seguro de qué depende el almacenamiento de una cadena en la memoria: sistema operativo, lenguaje?
Java almacena cadenas como UTF-16 internamente.
"codificación predeterminada" no es del todo correcta. Java almacena cadenas como UTF-16 internamente, pero la codificación utilizada externamente, la "codificación predeterminada del sistema", varía de una plataforma a otra e incluso puede modificarse mediante variables de entorno en algunas plataformas.
ASCII es un subconjunto de Latin 1 que es un subconjunto de Unicode. UTF-16 es una forma de codificar Unicode. Por lo tanto, si realiza su prueba
int i = ''x''
para cualquier carácter que se encuentre en el rango ASCII, obtendrá el valor ASCII. Sin embargo, UTF-16 puede representar muchos más caracteres que ASCII.De los documentos java.lang.Character :
La plataforma Java 2 usa la representación UTF-16 en matrices char y en las clases String y StringBuffer.
Por lo tanto, se define como parte de la plataforma Java 2 que UTF-16 se utiliza para estas clases.
1) Las cadenas son objetos, que generalmente contienen una matriz de caracteres y la longitud de las cadenas. La matriz de caracteres generalmente se implementa como una matriz contigua de palabras de 16 bits, cada una con un carácter Unicode en orden de bytes nativo.
2) Asignar un valor de carácter a un entero convierte el código de carácter Unicode de 16 bits en su equivalente entero. Por lo tanto, ''c''
, que es U + 0063, se convierte en 0x0063
o 99.
3) Como cada String
es un objeto, contiene otra información además de los miembros de su clase (p. Ej., Palabra de descripción de clase, palabra de bloqueo / semáforo, etc.).
ADENDUM
El contenido del objeto depende de la implementación de JVM (que determina la sobrecarga inherente asociada con cada objeto) y de cómo la clase está realmente codificada (es decir, algunas bibliotecas pueden ser más eficientes que otras).
EJEMPLO
Una implementación típica asignará una sobrecarga de dos palabras por instancia de objeto (para el descriptor / puntero de clase, y una palabra de control de semáforo / bloqueo); un objeto String
también contiene una longitud int
y una referencia de matriz char[]
. El contenido real de los caracteres de la cadena se almacena en un segundo objeto, la matriz char[]
, que a su vez tiene asignadas dos palabras, más una palabra de longitud de matriz, más tantos elementos char
16 bits como sea necesario para la cadena (más cualquier caracteres adicionales que quedaron colgando cuando se creó la cadena).
ADDENDUM 2
El caso de que un char represente un carácter Unicode solo es cierto en la mayoría de los casos. Esto implicaría UCS-2 codificación UCS-2 verdadera antes de 2005. Pero ahora Unicode se ha hecho más grande y las cadenas deben codificarse usando UTF-16, donde por desgracia un único carácter Unicode puede usar dos caracteres en una String
Java.
Eche un vistazo al código fuente real para la implementación de Apache, por ejemplo, en:
http://www.docjar.com/html/api/java/lang/String.java.html
Si bien esto no responde a su pregunta, vale la pena señalar que ... En el código de byte de Java (archivo de clase), la cadena se almacena en UTF-8. http://java.sun.com/docs/books/jvms/second_edition/html/ClassFile.doc.html
Editar: gracias a LoadMaster por ayudarme a corregir mi respuesta :)
1) Todo el procesamiento interno de cadenas se realiza en UTF-16.
2) ASCII es un subconjunto de UTF-16.
3) Internamente en Java es UTF-16. Por lo demás, depende de dónde estés, sí.