UTF-8 có thể mã hóa chuỗi 5 hoặc 6 byte, cho phép mã hóa tất cả các ký tự Unicode không? Tôi đang nhận được các tiêu chuẩn xung đột. Tôi cần có khả năng hỗ trợ mỗi ký tự Unicode, không chỉ trong phạm vi U + 0000..U + 10FFFF.Có 6 chuỗi octet UTF-8 hợp lệ không?
(Tất cả các dấu ngoặc kép là từ RFC 3629)
Phần 3:
Trong UTF-8 ký tự từ + 0000..U + 10FFFF phạm vi U (UTF-16 phạm vi truy cập) được mã hóa bằng các chuỗi từ 1 đến 4 octet. Chỉ chỉ octet của một "chuỗi" của một chuỗi có bit thứ tự cao hơn được đặt thành 0, 7 bit còn lại được sử dụng để mã hóa số ký tự. Trong một chuỗi octet số , n> 1, octet ban đầu có n thứ tự cao hơn bit được đặt thành 1, tiếp theo là bit được đặt thành 0. Số bit còn lại của octet đó chứa bit từ số của ký tự là được mã hóa. Tất cả octet sau đây đều có bit thứ tự cao hơn được đặt thành 1 và bit sau được đặt thành 0, để 6 bit trong mỗi bit chứa bit từ ký tự được mã hóa.
Vì vậy, không phải tất cả các ký tự có thể được mã hóa bằng UTF-8? Điều này có nghĩa là tôi không thể mã hóa các ký tự từ các mặt phẳng khác với BMP?
Phần 2:
Octet giá trị C0, C1, F5 để FF bao giờ xuất hiện.
Điều này có nghĩa là chúng tôi không thể mã hóa giá trị UTF-8 với 5 hoặc 6 octet (hoặc thậm chí một số có 4 giá trị không nằm trong phạm vi trên)?
Phần 12:
hạn chế phạm vi của các nhân vật để 0000-10FFFF (phạm vi UTF-16 thể truy cập).
Nhìn vào RFC trước xác nhận điều này ... chúng đã giảm phạm vi ký tự.
Phần 10:
Một vấn đề an ninh xảy ra khi mã hóa sang UTF-8: ISO/IEC 10646 mô tả về UTF-8 cho phép số nhân vật mã hóa lên đến U + 7FFFFFFF, năng suất chuỗi lên đến 6 byte. Do đó, có nguy cơ tràn bộ đệm nếu phạm vi của các số ký tự không phải là giới hạn rõ ràng với U + 10FFFF hoặc nếu kích thước bộ đệm không đưa vào số tính khả năng của chuỗi 5 và 6 byte.
Vì vậy, các chuỗi này được phép theo định nghĩa ISO/IEC 10646, nhưng không được định nghĩa RFC 3629? Tôi nên theo dõi cái nào?
Xin cảm ơn trước.
Cảm ơn, điều đó có ý nghĩa. Điều này có nghĩa là tôi chỉ cần phải lo lắng về chuỗi UTF-8 dài hơn 4 octet, với bất cứ điều gì còn là một lỗi? –
@PatrickNiedzielski Có, nhưng bạn phải coi chúng là lỗi ('MUST'). –
@devio, Điều gì sẽ xảy ra trong các phiên bản tương lai của Unicode khi chúng mở rộng nó? – Pacerier