java.nio.charset.Charset.forName("utf8").decode decodifica una secuencia de bytes de¿ED A0 80 ED B0 80 es una secuencia de bytes UTF-8 válida?
ED A0 80 ED B0 80
en el punto de código Unicode:
U+10000
java.nio.charset.Charset.forName("utf8").decode también decodifica una secuencia de bytes de
F0 90 80 80
en el punto de código Unicode:
U+10000
Esto se verifica por el code below.
Ahora esto parece indicarme que el esquema de codificación UTF-8 decodificará ED A0 80 ED B0 80
y F0 90 80 80
en el mismo punto de código Unicode.
Sin embargo, si volviese a https://www.google.com/search?query=%ED%A0%80%ED%B0%80,
puedo ver que es claramente diferente de la página https://www.google.com/search?query=%F0%90%80%80
Dado que la búsqueda de Google está usando esquema de codificación UTF-8 (corríjanme si me equivoco) también,
Esto sugiere que el UTF-8 no decodifica ED A0 80 ED B0 80
y F0 90 80 80
en el mismo punto (s) código Unicode.
Así que básicamente me preguntaba, por la norma oficial, debe UTF-8 decodificación ED A0 80 ED B0 80
secuencia de bytes en el punto de código Unicode U + 10000?
Código:
public class Test {
public static void main(String args[]) {
java.nio.ByteBuffer bb = java.nio.ByteBuffer.wrap(new byte[] { (byte) 0xED, (byte) 0xA0, (byte) 0x80, (byte) 0xED, (byte) 0xB0, (byte) 0x80 });
java.nio.CharBuffer cb = java.nio.charset.Charset.forName("utf8").decode(bb);
for (int x = 0, xx = cb.limit(); x < xx; ++x) {
System.out.println(Integer.toHexString(cb.get(x)));
}
System.out.println();
bb = java.nio.ByteBuffer.wrap(new byte[] { (byte) 0xF0, (byte) 0x90, (byte) 0x80, (byte) 0x80 });
cb = java.nio.charset.Charset.forName("utf8").decode(bb);
for (int x = 0, xx = cb.limit(); x < xx; ++x) {
System.out.println(Integer.toHexString(cb.get(x)));
}
}
}
Obtengo dos cadenas muy diferentes cuando I UTF-8 decodifica eso en LINQPad (C#). El último realmente da como resultado un "par suplente inválido" cuando se intenta el acceso de carácter. –
@pst ¿Está diciendo que el algoritmo de decodificación que utiliza Java es defectuoso? – Pacerier
@Pacerier: bueno, la implementación de Java UTF-8 es [conocida por ser defectuosa] (https://en.wikipedia.org/wiki/CESU-8). –