java.nio.charset.Charset.forName("utf8").decode dekoduje sekwencja bajtówCzy ED A0 80 ED B0 80 jest prawidłową sekwencją bajtów UTF-8?
ED A0 80 ED B0 80
do kodowy Unicode:
U+10000
java.nio.charset.Charset.forName("utf8").decode dekoduje również sekwencję bajtów
F0 90 80 80
do kodowy Unicode:
U+10000
Zostało to zweryfikowane przez code below.
Teraz wydaje mi się, że schemat kodowania UTF-8 dekoduje ED A0 80 ED B0 80
i F0 90 80 80
w ten sam kodek kodu Unicode.
Jednakże, jeśli mogę odwiedzić https://www.google.com/search?query=%ED%A0%80%ED%B0%80,
widzę, że jest to wyraźnie różni się od strony https://www.google.com/search?query=%F0%90%80%80
Od wyszukiwarce Google przy użyciu schematu kodowania UTF-8 (poprawcie mnie jeśli się mylę) również,
Sugeruje to, że kodowanie UTF-8 nie dekoduje ED A0 80 ED B0 80
i F0 90 80 80
w ten sam kod (y) kodu Unicode.
Więc w zasadzie zastanawiałem się, o standardzie oficjalnej należy UTF-8 dekodowania ED A0 80 ED B0 80
sekwencję bajtów na punkt kodowy Unicode U + 10000?
Kod:
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)));
}
}
}
Otrzymuję dwa bardzo różne ciągi, gdy UTF-8 dekodowane w LINQPad (C#). Ten ostatni w rzeczywistości daje "nieprawidłową parę zastępczą", gdy próbuje się uzyskać dostęp do postaci. –
@pst Czy mówisz, że algorytm dekodowania używany przez Javę jest wadliwy? – Pacerier
@Pacerier: Cóż, implementacja Java UTF-8 jest [znana jest wadą] (https://en.wikipedia.org/wiki/CESU-8). –