代码之家  ›  专栏  ›  技术社区  ›  twk Mark Adler

示例:utf8字符串无效?

  •  81
  • twk Mark Adler  · 技术社区  · 15 年前

    我正在测试我的一些代码如何处理坏数据,我需要一些无效的UTF-8字节序列。

    你能发表一些,理想情况下,解释一下他们为什么不好/你从哪里得到的?

    5 回复  |  直到 7 年前
        1
  •  63
  •   Nemanja Trifunovic    15 年前

    看一看 Markus Kuhn's UTF-8 decoder capability and stress test file

    您将发现许多UTF-8不规则的例子,包括孤独的起始字节、丢失的连续字节、过长的序列等。

        2
  •  44
  •   philfreo    14 年前

    在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",
    );
    

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

        3
  •  2
  •   user1015281    10 年前

    尤其是邪恶。我把它看成是Ubuntu上的组合。

    逗号短音符

        4
  •  1
  •   Dave Moten    7 年前

    从格式良好的字节序列表中可以得到格式错误的字节序列模式的概念。见“ Table 3-7. Well-Formed UTF-8 Byte Sequences “在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
    

    以下是从U+24B62生成的示例。我用它们做了一个错误报告: Bug #65045 mb_convert_encoding breaks well-formed character

    // 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"
    

    在各种库中可以看到尾随字节范围([0x80,0xBF])的过度简化。

    // 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
    
        5
  •  -5
  •   shoosh    15 年前

    模糊测试-生成一个随机的八位字节序列。很可能你会很快得到一些非法的序列。