Xem thêm Làm thế nào để một tệp có các ký tự Trung Quốc biết sử dụng bao nhiêu byte cho mỗi ký tự? - không nghi ngờ gì nữa, có những câu hỏi SO khác cũng sẽ hữu ích.
Trong UTF-8, bạn nhận được các loại byte sau:
Binary Hex Comments
0xxxxxxx 0x00..0x7F Only byte of a 1-byte character encoding
10xxxxxx 0x80..0xBF Continuation bytes (1-3 continuation bytes)
110xxxxx 0xC0..0xDF First byte of a 2-byte character encoding
1110xxxx 0xE0..0xEF First byte of a 3-byte character encoding
11110xxx 0xF0..0xF4 First byte of a 4-byte character encoding
(Dòng cuối cùng trông như thể nó phải đọc 0xF0..0xF7; tuy nhiên, phạm vi 21 bit của Unicode (U + 0000 - U + 10FFFF) có nghĩa là giá trị hợp lệ tối đa là 0xF4; các giá trị 0xF5..0xF7 không thể xảy ra trong UTF-8 hợp lệ.)
Xem xét liệu một chuỗi byte cụ thể có hợp lệ UTF-8 hay không có nghĩa là bạn cần suy nghĩ về:
- Các byte tiếp tục xuất hiện ở nơi không mong đợi
- Các byte không tiếp diễn xuất hiện ở nơi mong đợi một byte tiếp tục
- Các ký tự không đầy đủ ở cuối chuỗi (biến thể của 'dự kiến byte tiếp tục')
- Trình tự không tối thiểu
- UTF-16 thay thế
Trong UTF-8 hợp lệ, các byte 0xF5..0xFF không thể xảy ra.
Trình tự không tối thiểu
Có thể có nhiều biểu diễn cho một số ký tự. Ví dụ, ký tự Unicode U + 0000 (ASCII NUL) có thể được biểu thị bằng:
0x00
0xC0 0x80
0xE0 0x80 0x80
0xF0 0x80 0x80 0x80
Tuy nhiên, tiêu chuẩn Unicode nói rõ rằng ba lựa chọn thay thế cuối cùng không được chấp nhận vì chúng không phải là tối thiểu. Điều này xảy ra là các byte 0xC0 và 0xC1 không bao giờ có thể xuất hiện trong UTF-8 hợp lệ vì các ký tự duy nhất có thể được mã hóa bởi những ký tự đó được mã hóa tối thiểu thành các ký tự byte đơn trong phạm vi 0x00..0x7F.
Đại diện UTF-16
Trong Mặt phẳng đa ngôn ngữ Cơ bản (BMP), các giá trị Unicode U + D800 - U + DFFF được dành riêng cho các đại diện UTF-16 và không thể xuất hiện được mã hóa trong UTF-8 hợp lệ. Nếu chúng hợp lệ trong UTF-8 (mà tôi nhấn mạnh, chúng không hợp lệ), thì các đại diện sẽ được mã hóa:
- U + D800 - 0xED 0xA0 0x80 (thay thế cao nhỏ nhất)
- U + DBFF - 0xED 0xAF 0xBF (thay thế cao lớn nhất)
- U + DC00 - 0xED 0xB0 0x80 (thay thế thấp nhất nhỏ nhất)
- U + DFFF - 0xED 0xBF 0xBF (thay thế thấp nhất lớn nhất)
Dữ liệu xấu
Vì vậy, dữ liệu BAD của bạn phải chứa các mẫu vi phạm các đơn thuốc khác nhau này.
- Byte tiếp tục không đứng trước một trong các giá trị byte ban đầu
- Các byte ban đầu gồm nhiều ký tự không được theo sau bởi đủ các byte tiếp theo
- Các ký tự nhiều byte không tối thiểu
- UTF-16 thay thế
- Các byte không hợp lệ (0xC0, 0xC1, 0xF5..0xFF).
Lưu ý rằng dấu thứ tự byte (BOM) U + FEFF, còn gọi là khoảng cách không ngắt độ rộng bằng 0 (ZWNBSP), không thể xuất hiện không được mã hóa trong UTF-8 - các byte 0xFF và 0xFE không được phép trong UTF-8 hợp lệ. Một ZWNBSP được mã hóa có thể xuất hiện trong tệp UTF-8 dưới dạng 0xEF 0xBB 0xBF, nhưng BOM hoàn toàn không cần thiết trong UTF-8.
Ngoài ra còn có một số noncharacters trong Unicode. U + FFFE và U + FFFF là hai ký tự không như vậy (và hai điểm mã cuối cùng trong mỗi mặt phẳng, U + 1FFFE, U + 1FFFF, U + 2FFFE, U + 2FFFF, ... U + 10FFFE, U + 10FFFF là những ký tự khác ). Chúng thường không xuất hiện trong dữ liệu Unicode để trao đổi dữ liệu, nhưng có thể xuất hiện trong mục đích sử dụng riêng. Xem liên kết Câu hỏi thường gặp về Unicode để biết nhiều chi tiết sơ sài, bao gồm lịch sử khá phức tạp của các ký tự không phải ký tự trong Unicode. ( Corrigendum # 9: Làm rõ về các ký tự không phải ký tự, được phát hành vào tháng 1 năm 2013, thực hiện những gì tiêu đề của nó gợi ý - làm rõ ý nghĩa của các ký tự không phải.)