Java char
se utiliza convencionalmente para celebrar una Unicode code unit; es decir, una unidad de 16 bits que es parte de una secuencia UTF-16 válida. Sin embargo, no hay nada que impida que una aplicación coloque un valor sin signo de 16 bits en char
, independientemente de lo que realmente signifique.
Así que se podría decir que una unidad de código Unicode puede ser representado por un char
y una char
puede representan una unidad de código Unicode ... pero ninguno de ellos es necesariamente cierto, en el caso general.
No se puede responder su pregunta sobre cómo se almacena un Java char
. Simplemente dicho, depende de lo que entendemos por "almacenado":
Si se refiere a "representada en un programa en ejecución", entonces la respuesta es la implementación JVM específica. (El tipo de datos char
se suele representar como un número entero máquina de 16 bits, aunque puede o no puede ser la palabra máquina de alineado, dependiendo del contexto específico.)
Si se refiere a "almacenados en un archivo" o algo parecido eso, entonces la respuesta es completamente dependiente sobre cómo la aplicación elige almacenarlo.
es el tipo Char Java garantizado para ser almacenados en cualquier codificación particular?
A la luz de lo que dije antes, la respuesta es "No". En una aplicación en ejecución, corresponde a la aplicación decidir qué significa char
/contains. Cuando se almacena un archivo char
, la aplicación decide cómo quiere almacenarlo y qué representación en disco usará.
FOLLOWUP
¿Qué pasa con los literales Char? Por ejemplo, 'c' debe tener algún valor que esté definido por el idioma.
Depende de la forma literal del carácter y del carácter. Por ejemplo, 'c' tendrá el valor de los 16 bits inferiores del punto de código Unicode para 'c' en minúscula. Pero un literal expresado como '\ uxxxx' puede no representar un punto de código Unicode válido. O (dependiendo de lo que signifique la aplicación) puede no representar un personaje en absoluto.
Esto también es (potencialmente) complica por la codificación del archivo de código fuente. Es teóricamente posible representar su código fuente en una codificación de caracteres personalizada en la que (por razones de argumento) las letras mayúsculas se codifican como minúsculas, y viceversa. Si lo ha hecho, y que fueron capaces de registrar el codificador juego de caracteres correspondiente y el decodificador antes de lanzar el compilador, a continuación, un literal que se parece a 'c'
(ver la entrada como ASCII o UTF-8) en realidad tendría el valor 67
en el programa compilador en lugar de 99
.
Al menos eso creo ...
Y aquí es otro caso extremo:
String s = "\u0001\uxxxx";
representa una cadena que contiene dos unidades de código y un punto de código, pero
char c = '\u0001\uxxxx';
es (o debería ser) ilegal ... porque aunque el analizador ve un punto de código, ese punto de código no cabe en un char
.
respuesta corta a su pregunta, se ** No se no se garantiza ** –
Sí, lo es. La representación interna está bastante bien definida. –
@Ernest: no, no lo es. Muchas de las clases de biblioteca estándar de Java están diseñadas para funcionar bajo la suposición de que un 'char' contiene una unidad de código Unicode, pero la aplicación básicamente puede poner cualquier valor entero sin signo de 16 bits en un' char'. No es necesario codificar el valor de ninguna manera en particular. Ni siquiera necesita representar un "personaje" completo (o parcial). –