2011-08-11 5 views
7

¿Está garantizado que el tipo de caracteres Java se almacene en cualquier codificación en particular?¿En qué codificación está almacenado un carácter Java?

Editar: He formulado esta pregunta incorrectamente. Lo que quise preguntar es ¿Están los caracteres literales garantizados para usar cualquier codificación particular?

+0

respuesta corta a su pregunta, se ** No se no se garantiza ** –

+1

Sí, lo es. La representación interna está bastante bien definida. –

+1

@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). –

Respuesta

13

"Almacenado" ¿dónde? Todas las cadenas en Java son represented in UTF-16. Cuando se escribe en un archivo, se envía a través de una red, o lo que sea, se envía utilizando la codificación de caracteres que especifique.

Edición: Específicamente para el tipo char, consulte el Character docs. Específicamente: "El tipo de datos char ... se basa en la especificación original Unicode, que define los caracteres como entidades de 16 bits de ancho fijo". Por lo tanto, fundir char en int siempre le dará un valor UTF-16 si en realidad contiene char un carácter de ese juego de caracteres. Si simplemente introdujo un valor aleatorio en char, obviamente no será necesariamente un carácter UTF-16 válido, y del mismo modo si lee el carácter al usar una codificación incorrecta. Los documentos continúan para analizar cómo los caracteres suplementarios UTF-16 solo pueden representarse con un int, ya que char no tiene espacio suficiente para contenerlos, y si está operando en este nivel, podría ser importante familiarizarse con con esa semántica.

+0

En realidad estoy interesado en char, no en String. "Almacenado" como en si lo lanzo a un int, ¿está garantizado que esté en una codificación particular? – pepsi

+0

@pepsi: Actualizado mi respuesta –

+0

Perfecto, ese enlace es exactamente lo que estaba buscando. ¡Gracias! – pepsi

2

Originalmente, Java usaba UCS-2 internamente; ahora usa UTF-16. Los dos son prácticamente idénticos, a excepción de D800 - DFFF, que se utilizan en UTF-16 como parte de la representación ampliada para caracteres más grandes.

4

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 charpuede 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.

+0

¿Cómo puede un literal expresado como '\ uxxxx' no representar un punto de código válido? ¿Puede dar un ejemplo? – Philipp

+0

Algunos valores en el rango 0-65535 están definidos por la especificación Unicode como puntos de código no válidos. 65535 es un ejemplo que es ilegal: un "no carácter". Otros están "sin asignar". Consulte http://www.unicode.org/versions/Unicode6.0.0/ch16.pdf para más detalles. –

+0

Todos los enteros en el rango 0-65535 son puntos de código válidos. – Philipp

Cuestiones relacionadas