Một trong những yêu cầu của tôi là "Tên hộp văn bản chỉ chấp nhận bộ ký tự UTF-8". Tôi muốn thực hiện một thử nghiệm âm tính bằng cách nhập một bộ ký tự không phải UTF-8. Tôi có thể làm cái này như thế nào?Làm cách nào để tạo Bộ ký tự không phải UTF-8
Trả lời
Nếu bạn đang yêu cầu làm thế nào để xây dựng một tổ chức phi UTF-8 nhân vật, mà nên dễ dàng từ this definition from Wikipedia:
Đối với các điểm mã U + 0000 thông qua U + 007F, mỗi điểm mã là một trong byte dài và trông như thế này:
0xxxxxxx // a
Đối với các điểm mã U + 0080 thông qua U + 07FF, mỗi điểm mã có chiều dài hai byte và trông như thế này:
110xxxxx 10xxxxxx // b
Và cứ tiếp tục như vậy.
Vì vậy, để xây dựng một ký tự UTF-8 bất hợp pháp dài một byte, bit cao nhất phải là 1 (khác với mẫu a) và bit cao thứ hai phải bằng 0 (khác với mẫu b) :
10xxxxxx
hoặc
111xxxxx
nào cũng khác với cả hai mô hình.
Với cùng một logic, bạn có thể tạo các chuỗi mã lệnh bất hợp pháp dài hơn hai byte.
Bạn không thẻ một ngôn ngữ, nhưng tôi đã phải thử nghiệm nó, vì vậy tôi đã sử dụng Java:
for (int i=0;i<255;i++) {
System.out.println(
i + " " +
(byte)i + " " +
Integer.toHexString(i) + " " +
String.format("%8s", Integer.toBinaryString(i)).replace(' ', '0') + " " +
new String(new byte[]{(byte)i},"UTF-8")
);
}
0 đến 31 là các ký tự không in được, sau đó 32 là không gian, tiếp theo là các ký tự in:
...
31 31 1f 00011111
32 32 20 00100000
33 33 21 00100001 !
...
126 126 7e 01111110 ~
127 127 7f 01111111
128 -128 80 10000000 �
delete
là 0x7f
và sau đó, từ 128 bao gồm đến 254 ký tự không hợp lệ được in. Bạn có thể nhìn thấy từ UTF-8 chartable thêm:
Codepoint U+007F
được thể hiện với một byte 0x7F
(bit 01111111
), trong khi điểm mã U+0080
được biểu diễn với hai byte 0xC2 0x80
(bit 11000010 10000000
).
Nếu bạn không quen thuộc với UTF-8 Tôi mạnh mẽ khuyên bạn nên đọc bài viết tuyệt vời này:
Qua một giao diện người dùng, bạn sẽ có một thời gian khó làm điều này. Bạn sẽ cần phải bằng cách nào đó làm nó theo chương trình. – leppie
Bắt đầu bằng cách xác định * ngôn ngữ lập trình *, môi trường và/hoặc ngữ cảnh của bạn. Điều này sẽ rất khác nhau tùy thuộc vào hệ thống bạn đang làm việc với/on/in. – deceze
tại sao DOWNVOTE cho câu hỏi này? – swapneel