web-dev-qa-db-fra.com

Exemple de chaîne utf8 non valide?

Je teste la façon dont une partie de mon code gère les données incorrectes et j'ai besoin de quelques séries d'octets non valides UTF-8.

Pouvez-vous en poster, et idéalement, une explication de pourquoi ils sont mauvais/où vous les avez obtenus?

89
twk

Jetez un oeil à capacité de décodeur UTF-8 de Markus Kuhn et fichier de test de stress

Vous trouverez des exemples de nombreuses irrégularités UTF-8, y compris des octets de démarrage solitaires, des octets de continuation manquants, des séquences trop longues, etc.

68
Nemanja Trifunovic

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

48
philfreo

, ̆ était particulièrement mauvais. Je le vois comme combiné sur Ubuntu.

virgule-breve

4
user1015281

L'idée de modèles de séquences d'octets mal formées peut être obtenue à partir du tableau des séquences d'octets bien formées. Voir " Tableau 3-7. Séquences d'octets UTF-8 bien formées " dans la norme 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

Voici les exemples générés à partir de U + 24B62. Je les ai utilisés pour un rapport de bogue: le bogue n ° 65045 mb_convert_encoding casse un caractère bien formé

// 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 simplification excessive de la plage d'octets de fin ([0x80, 0xBF]) peut être observée dans les différentes bibliothèques.

// 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
2
masakielastic