Esta es el arreglo más acertada que te podemos dar, sin embargo estúdiala pausadamente y analiza si es compatible a tu trabajo.
Solución:
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 mediante un par de 2 caracteres conocido como par sustituto.
Si no pasa un valor de parámetro a String.getBytes()
devuelve un byte array que tiene el String
contenidos codificados utilizando el conjunto de caracteres predeterminado del sistema operativo subyacente. Si desea asegurarse de una codificación UTF-8 array entonces necesitas usar getBytes("UTF-8")
en cambio.
Vocación String.charAt()
devuelve un carácter original codificado en UTF-16 del almacenamiento en memoria de String únicamente.
Entonces, en su ejemplo, el carácter Unicode ョ
se almacena en el String
almacenamiento en memoria utilizando dos bytes codificados en UTF-16 (0x6E 0xFF
o 0xFF 0x6E
dependiendo de endian), pero se almacena en el byte array desde getBytes()
usando tres bytes que están codificados usando cualquiera que sea el juego de caracteres predeterminado del sistema operativo.
En UTF-8, ese carácter Unicode en particular también usa 3 bytes (0xEF 0xBD 0xAE
).
String.getBytes()
devuelve los bytes usando la codificación de caracteres predeterminada de la plataforma que no necesariamente coincide con la representación interna.
Es mejor que nunca utilice 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. Usar String.getBytes(String charsetName)
en su lugar, especifique explícitamente el conjunto de caracteres que debe usarse para codificar su cadena en bytes.
UTF-8 es una codificación de longitud variable que usa solo un byte para 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 decir “esta es una secuencia de varios 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 el byte resultante. arrayasí es como funciona la codificación UTF-8.
Eres capaz de confirmar nuestro estudio exponiendo un comentario y dejando una puntuación te damos la bienvenida.