¿Ejemplo de cadena utf8 no válida?

Respuestas:

50

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

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

philfreo
fuente
4

, ̆ era particularmente malvado. Lo veo combinado en ubuntu.

coma-breve

usuario1015281
fuente
3

La idea de patrones de secuencias de bytes mal formadas se puede obtener de la tabla de secuencias de bytes bien formadas. Consulte la " Tabla 3-7. Secuencias de bytes UTF-8 bien formadas " en el estándar 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

Aquí están los ejemplos generados a partir de U + 24B62. Los usé para un informe de error: el error # 65045 mb_convert_encoding rompe un carácter bien formado

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

La simplificación excesiva del rango de bytes finales ([0x80, 0xBF]) se puede ver en las diversas bibliotecas.

// 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
masakielástica
fuente
-6

Prueba de fuzz: genera una secuencia aleatoria de octetos. Lo más probable es que obtengas algunas secuencias ilegales más temprano que tarde.

shoosh
fuente
7
No hay nada peor que tener heisenbugs o eisentests. Las pruebas pasan 10 veces, usted lanza el producto, la prueba falla.
Eric Duminil
@EricDuminil ha oído hablar de srand ()?
shoosh
4
Lo suficientemente justo. ¿Podría mencionarlo en la respuesta para que pueda revertir mi voto negativo?
Eric Duminil
2
Ah ah. Bueno, siempre hay algo nuevo que aprender, por eso vine a SO en primer lugar. Creo que tu srand()consejo es una buena idea, podría ayudar a otras personas aquí.
Eric Duminil
Podemos crear las cadenas inválidas directamente, no necesitamos aleatoriedad para tratar de encontrarlas, aunque las bibliotecas de procesamiento de cadenas se beneficiarían (¡probablemente!) De la fuzzing por si acaso.
Galva