Ví dụ chuỗi utf8 không hợp lệ?


96

Tôi đang kiểm tra cách một số mã của mình xử lý dữ liệu xấu và tôi cần một vài chuỗi byte không hợp lệ UTF-8.

Bạn có thể đăng một số, và lý tưởng nhất là lời giải thích tại sao chúng tệ / bạn lấy chúng ở đâu?


Câu trả lời:



50

Trong PHP:

$examples = array(
    'Valid ASCII' => "a",
    'Valid 2 Octet Sequence' => "\xc3\xb1",
    'Invalid 2 Octet Sequence' => "\xc3\x28",
    'Invalid Sequence Identifier' => "\xa0\xa1",
    'Valid 3 Octet Sequence' => "\xe2\x82\xa1",
    'Invalid 3 Octet Sequence (in 2nd Octet)' => "\xe2\x28\xa1",
    'Invalid 3 Octet Sequence (in 3rd Octet)' => "\xe2\x82\x28",
    'Valid 4 Octet Sequence' => "\xf0\x90\x8c\xbc",
    'Invalid 4 Octet Sequence (in 2nd Octet)' => "\xf0\x28\x8c\xbc",
    'Invalid 4 Octet Sequence (in 3rd Octet)' => "\xf0\x90\x28\xbc",
    'Invalid 4 Octet Sequence (in 4th Octet)' => "\xf0\x28\x8c\x28",
    'Valid 5 Octet Sequence (but not Unicode!)' => "\xf8\xa1\xa1\xa1\xa1",
    'Valid 6 Octet Sequence (but not Unicode!)' => "\xfc\xa1\xa1\xa1\xa1\xa1",
);

Từ http://www.php.net/manual/en/reference.pcre.pattern.modifiers.php#54805



3

Ý tưởng về các mẫu của chuỗi byte không hợp lệ có thể được lấy từ bảng các chuỗi byte được hình thành tốt. Xem " Bảng 3-7. Các chuỗi UTF-8 Byte được định dạng tốt " trong Tiêu chuẩn Unicode 6.2.

    Code Points    First Byte Second Byte Third Byte Fourth Byte
  U+0000 -   U+007F   00 - 7F
  U+0080 -   U+07FF   C2 - DF    80 - BF
  U+0800 -   U+0FFF   E0         A0 - BF     80 - BF
  U+1000 -   U+CFFF   E1 - EC    80 - BF     80 - BF
  U+D000 -   U+D7FF   ED         80 - 9F     80 - BF
  U+E000 -   U+FFFF   EE - EF    80 - BF     80 - BF
 U+10000 -  U+3FFFF   F0         90 - BF     80 - BF    80 - BF
 U+40000 -  U+FFFFF   F1 - F3    80 - BF     80 - BF    80 - BF
U+100000 - U+10FFFF   F4         80 - 8F     80 - BF    80 - BF

Dưới đây là các ví dụ được tạo từ U + 24B62. Tôi đã sử dụng chúng cho một báo cáo lỗi: Lỗi # 65045 mb_convert_encoding phá vỡ ký tự được định dạng tốt

// U+24B62: "\xF0\xA4\xAD\xA2"
"\xF0\xA4\xAD"    ."\xF0\xA4\xAD\xA2"."\xF0\xA4\xAD\xA2"
"\xF0\xA4\xAD\xA2"."\xF0\xA4\xAD\xA2"."\xF0\xA4\xAD"

Có thể thấy sự đơn giản hóa quá mức của phạm vi byte theo sau ([0x80, 0xBF]) trong các thư viện khác nhau.

// U+0800 - U+0FFF
\xE0\x80\x80

// U+D000 - U+D7FF
\xED\xBF\xBF

// U+10000 -  U+3FFFF
\xF0\x80\x80\x80

// U+100000 - U+10FFFF
\xF4\xBF\xBF\xBF

-6

Kiểm tra Fuzz - tạo ra một chuỗi các octet ngẫu nhiên. Nhiều khả năng bạn sẽ nhận được một số chuỗi bất hợp pháp sớm hơn.


7
Không có gì tồi tệ hơn việc có heisenbugs hoặc eisentest. Kiểm tra vượt qua 10 lần, bạn phát hành sản phẩm, kiểm tra không thành công.
Eric Duminil

@EricDuminil đã bao giờ nghe nói về srand () chưa?
shoosh

4
Đủ công bằng. Bạn có thể vui lòng đề cập đến nó trong câu trả lời để tôi có thể hoàn nguyên phiếu phản đối của mình không?
Eric Duminil

2
Ah ah. Chà, luôn có điều gì đó mới để học, đó là lý do tại sao tôi đến SO ngay từ đầu. Tôi nghĩ srand()lời khuyên của bạn là một ý kiến ​​hay, nó có thể giúp ích cho những người khác ở đây.
Eric Duminil

Chúng tôi có thể tạo các chuỗi không hợp lệ trực tiếp, chúng tôi không cần ngẫu nhiên để thử và cuối cùng tìm thấy chúng, mặc dù các thư viện xử lý chuỗi sẽ (có thể!) Được lợi từ việc làm mờ chỉ trong trường hợp.
galva
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.