UTF-8 là một cách tương đối đơn giản để mã hóa các điểm mã Unicode theo định dạng có độ rộng thay đổi sao cho nó không dễ nhầm lẫn mã không nhận biết Unicode.
Tổng quan về UTF-8
- Byte trong phạm vi 1-0x7F, bao gồm, thường có giá trị
- Byte với mẫu bit
10XX XXXX
được coi là byte tiếp tục, với sáu bit có ý nghĩa nhỏ nhất được sử dụng để mã hóa một phần của một điểm mã. Chúng không được xuất hiện trừ khi chúng được mong đợi bởi một byte trước đó. - Byte với mẫu
110X XXXX
mong đợi một byte tiếp tục sau đó - Byte với mẫu
1110 XXXX
mong đợi hai byte tiếp tục sau đó - Byte với mẫu
1111 0XXX
mong đợi ba byte tiếp tục sau đó - Tất cả các byte khác không hợp lệ và sẽ không xuất hiện ở bất kỳ đâu trong luồng UTF-8. Về lý thuyết, các cụm 5, 6 và 7 byte có thể, nhưng sẽ không được phép cho các mục đích của thử thách này.
Mã hóa quá dài
UTF-8 cũng yêu cầu một mật mã phải được biểu diễn với số byte tối thiểu. Bất kỳ chuỗi byte nào có thể được biểu diễn với ít byte hơn đều không hợp lệ. UTF-8 đã sửa đổi thêm một ngoại lệ cho ký tự null (U + 0000), được thể hiện dưới dạng C0 80
(biểu diễn hex)) và thay vào đó không cho phép các byte rỗng xuất hiện ở bất kỳ đâu trong luồng. (Điều này làm cho nó tương thích với các chuỗi kết thúc null)
Thử thách
Bạn phải tạo một chương trình, khi được cung cấp một chuỗi byte, sẽ xác định xem chuỗi đó có đại diện cho UTF-8 đã sửa đổi hợp lệ hay không và sẽ trả về giá trị trung thực nếu hợp lệ và giá trị sai lệch. Lưu ý rằng bạn phải kiểm tra mã hóa quá dài và byte rỗng (vì đây là UTF-8 đã sửa đổi). Bạn không cần giải mã các giá trị UTF-8.
Ví dụ
41 42 43 ==> yes (all bytes are in the 0-0x7F range)
00 01 02 ==> no (there is a null byte in the stream)
80 7F 41 ==> no (there is a continuation byte without a starter byte)
D9 84 10 ==> yes (the correct number of continuation bytes follow a starter byte)
F0 81 82 41 ==> no (there are not enough continuation bytes after F0)
EF 8A A7 91 ==> no (too many continuation bytes)
E1 E1 01 ==> no (starter byte where a continuation byte is expected)
E0 80 87 ==> no (overlong encoding)
41 C0 80 ==> yes (null byte encoded with the only legal overlong encoding)
F8 42 43 ==> no (invalid byte 'F8')
Quy tắc
- Quy tắc chuẩn và sơ hở áp dụng
- Đầu vào và đầu ra có thể ở bất kỳ định dạng thuận tiện nào miễn là tất cả các giá trị trong phạm vi byte không dấu (0-255) có thể được đọc.
- Bạn có thể cần phải sử dụng một mảng hoặc tệp chứ không phải là một chuỗi kết thúc null. Bạn cần có khả năng đọc byte rỗng.
- Mã ngắn nhất sẽ thắng!
- Lưu ý rằng việc sử dụng nội dung để giải mã UTF-8 không được đảm bảo tuân thủ các yêu cầu được đưa ra ở đây. Bạn có thể cần phải làm việc xung quanh nó và tạo ra các trường hợp đặc biệt.
EDIT: phần thưởng được thêm vào khi không sử dụng nội dung giải mã UTF-8
EDIT2: đã xóa phần thưởng vì chỉ có câu trả lời Rust đủ điều kiện và thật khó để xác định.