example - codificación java utf8-char, tipos de cadenas
encoding utf-8 java example (4)
public class UTF8 {
public static void main(String[] args){
String s = "ヨ"; //0xFF6E
System.out.println(s.getBytes().length);//length of the string
System.out.println(s.charAt(0));//first character in the string
}
}
salida:
3
ヨ
Por favor ayúdame a entender esto. Intentando entender cómo funciona la codificación utf8 en java. Según la definición java doc de char char: El tipo de datos char es un único carácter Unicode de 16 bits.
¿Significa que el tipo de caracteres en java solo puede admitir aquellos caracteres Unicode que pueden representarse con 2 bytes y no más que eso?
En el programa anterior, el número de bytes asignados para esa cadena es 3, pero en la tercera línea que devuelve el primer carácter (2 bytes en java), ¿puede contener un carácter que tenga 3 bytes de longitud? realmente confundido aqui?
Cualquier buena referencia sobre este concepto en java / general sería realmente apreciada.
Así es como Java representa los caracteres: http://docs.oracle.com/javase/7/docs/api/java/lang/Character.html#unicode
Nada en su ejemplo de código está usando directamente UTF-8. Las cadenas Java se codifican en la memoria utilizando UTF-16 en su lugar. Los puntos de código Unicode que no caben en un solo carácter de 16 bits se codificarán utilizando un par de 2 caracteres conocido como par suplente.
Si no pasa un valor de parámetro a String.getBytes()
, devuelve una matriz de bytes que tiene el contenido de String
codificado usando el conjunto de caracteres predeterminado del sistema operativo subyacente. Si desea asegurar una matriz codificada en UTF-8, entonces necesita usar getBytes("UTF-8")
lugar.
Llamar a String.charAt()
devuelve un carácter codificado en UTF-16 original solo del almacenamiento en memoria del String.
Por lo tanto, en su ejemplo, el carácter Unicode stored se almacena en el almacenamiento en memoria de la String
utilizando dos bytes codificados en UTF-16 ( 0x6E 0xFF
o 0xFF 0x6E
según endian), pero se almacena en la matriz de bytes desde getBytes()
usando tres bytes que están codificados con lo que sea el conjunto de caracteres predeterminado del sistema operativo.
En UTF-8, ese carácter particular de Unicode también usa 3 bytes ( 0xEF 0xBD 0xAE
).
UTF-8 es una codificación de longitud variable, que usa solo un byte para los caracteres ASCII (valores entre 0 y 127) y dos, tres (o incluso más) bytes para otros símbolos Unicode.
Esto se debe a que el bit más alto del byte se usa para indicar "esta es una secuencia de múltiples bytes", por lo que un bit en 8 no se usa para representar datos "reales" (el código char) sino para marcar el byte.
Entonces, a pesar de que Java usa 2 bytes en ram para cada carácter, cuando los caracteres se "serializan" usando UTF-8, pueden producir uno, dos o tres bytes en la matriz de bytes resultante, así es como funciona la codificación UTF-8.
String.getBytes()
devuelve los bytes utilizando la codificación de caracteres predeterminada de la plataforma que no coincide necesariamente con la representación interna.
Lo mejor es no usar este método en la mayoría de los casos, porque en la mayoría de los casos no tiene sentido confiar en la codificación predeterminada de la plataforma. Use String.getBytes(String charsetName)
lugar y especifique explícitamente el conjunto de caracteres que debe usarse para codificar su String en bytes.