2013-04-16 15 views
11

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

+0

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

+2

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

+0

tại sao DOWNVOTE cho câu hỏi này? – swapneel

Trả lời

8

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:

utf8 definition

Đố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 � 

delete0x7f 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:

image

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:

The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)