java.nio.charset.Charset.forName("utf8").decode decodifica una sequenza di byte diED A0 80 ED B0 80 una sequenza di byte UTF-8 valida?
ED A0 80 ED B0 80
nel codepoint Unicode:
U+10000
java.nio.charset.Charset.forName("utf8").decode decodifica anche una sequenza di byte di
F0 90 80 80
nel codepoint Unicode:
U+10000
Questo è verificato dal code below.
Ora sembra dirmi che lo schema di codifica UTF-8 decodificherà ED A0 80 ED B0 80
e F0 90 80 80
nello stesso punto di codice unicode.
Tuttavia, se visito https://www.google.com/search?query=%ED%A0%80%ED%B0%80,
posso vedere che è chiaramente diversa dalla pagina https://www.google.com/search?query=%F0%90%80%80
Poiché la ricerca di Google sta usando schema di codifica UTF-8 (correggetemi se sbaglio),
Ciò suggerisce che l'UTF-8 non decodifica ED A0 80 ED B0 80
e F0 90 80 80
negli stessi codici unicode (s).
Quindi, in pratica mi chiedevo, per lo standard ufficiale, dovrebbe UTF-8 decodifica ED A0 80 ED B0 80
sequenza di byte in Unicode codepoint U + 10000?
Codice:
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)));
}
}
}
Ottengo due stringhe molto diverse quando UTF-8 lo decodifica in LINQPad (C#). Quest'ultimo in realtà si traduce in una "coppia surrogata non valida" quando si tenta l'accesso al carattere. –
@ pst Stai dicendo che l'algoritmo di decodifica utilizzato da Java è difettoso? – Pacerier
@Pacerier: beh, l'implementazione Java UTF-8 è [nota per essere difettosa] (https://en.wikipedia.org/wiki/CESU-8). –