java.nio.charset.Charset.forName("utf8").decode giải mã một chuỗi byte củaED A0 80 ED B0 80 có phải là một chuỗi byte UTF-8 hợp lệ không?
ED A0 80 ED B0 80
vào điểm mã Unicode:
U+10000
java.nio.charset.Charset.forName("utf8").decode cũng giải mã một chuỗi byte của
F0 90 80 80
vào điểm mã Unicode:
U+10000
Điều này được xác minh bởi code below.
Bây giờ điều này dường như nói với tôi rằng lược đồ mã hóa UTF-8 sẽ giải mã ED A0 80 ED B0 80
và F0 90 80 80
vào cùng một điểm mã hóa unicode.
Tuy nhiên, nếu tôi đến thăm https://www.google.com/search?query=%ED%A0%80%ED%B0%80,
tôi có thể thấy rằng nó rõ ràng là khác nhau từ trang https://www.google.com/search?query=%F0%90%80%80
Kể từ khi Google Search đang sử dụng chương trình mã UTF-8 (chính xác cho tôi nếu tôi sai) là tốt,
Điều này cho thấy rằng UTF-8 không giải mã ED A0 80 ED B0 80
và F0 90 80 80
vào cùng một điểm mã unicode (s). Vì vậy, về cơ bản tôi đã tự hỏi, theo tiêu chuẩn chính thức, nên UTF-8 giải mã trình tự byte ED A0 80 ED B0 80
vào mã Unicode Unicode U + 10000 không? Không.
Mã:
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)));
}
}
}
Tôi nhận được hai chuỗi rất khác nhau khi tôi UTF-8 giải mã trong LINQPad (C#). Cái sau thực sự dẫn đến một "cặp thay thế không hợp lệ" khi truy cập nhân vật khôn ngoan được cố gắng. –
@pst Bạn đang nói rằng thuật toán giải mã mà Java sử dụng là thiếu sót? – Pacerier
@Pacerier: tốt, việc thực thi Java UTF-8 là [được biết đến là thiếu sót] (https://en.wikipedia.org/wiki/CESU-8). –