Wirklich gute, schlechte UTF-8-Beispieltestdaten [geschlossen]

88

Wir haben also das XSS-Spickzettel , um unsere XSS-Filterung zu testen - aber abgesehen von einer gutartigen Beispielseite kann ich keine bösen oder fehlerhaften Testdaten finden, um sicherzustellen, dass mein UTF-8-Code fehlerhafte Daten verarbeiten kann.

Wo finde ich gute und schlechte Daten zum Testen? Oder was ist eine knifflige Folge von Zeichen?

Xeoncross
quelle
4
columbia.edu/kermit/utf8.html ist eine weitere gute
Xeoncross
14
ăѣ𝔠 ծ ềſģȟ Ꭵ𝒋 ǩľḿꞑȯ𝘱𝑞𝗋𝘴ȶ𝞄𝜈ψ𝒙𝘆𝚣1234567890! @ # $% ^ & * () -_ = + [{]};: '", <.> /? ~𝘈Ḇ𝖢𝕯٤ḞԍНǏ𝙅ƘԸⲘ𝙉০Ρ𝗤Ɍ𝓢ȚЦ𝒱Ѡ𝓧ƳȤѧᖯć𝗱ễ𝑓𝙜Ⴙ𝞲𝑗𝒌ļṃʼnо𝞎𝒒ᵲꜱ𝙩ừ𝗏ŵ𝒙𝒚ź1234567890!@#$%^&*()-_=+[{]};:'",<.>/?~ : '", <.> /? ~Ѧ𝙱ƇᗞΣℱԍҤ١𝔍К𝓛𝓜ƝȎ𝚸𝑄Ṛ𝓢ṮṺƲᏔꓫ𝚈𝚭𝜶Ꮟçძ𝑒𝖿𝗀ḧ𝗂𝐣ҝɭḿ𝕟𝐨𝝔𝕢ṛ𝓼тú𝔳ẃ⤬𝝲𝗓1234567890!@#$%^&*()-_=+[{]};:'",<.>/?~ 𝖠Β𝒞𝘋𝙴𝓕ĢȞỈ𝕵ꓗʟ𝙼ℕ০𝚸𝗤 Հꓢ ṰǓⅤ𝔚 Ⲭ𝑌𝙕𝘢𝕤
Andrew

Antworten:

98

Schauen Sie sich Markus Kuhns UTF-8-Decoder-Stresstest an

zildjohn01
quelle
1
Obwohl Sie sich nicht darum bemüht haben, ist diese Seite genau das, wonach ich gesucht habe. ;)
Xeoncross
72
Vergessen Sie nicht, zu wissen, wo Sie die Antwort finden, ist oft genauso wichtig wie zu wissen, wo Sie die Antwort finden.
Jonathan Leffler
18
Ich möchte Sie warnen, dass sein Test auf einer veralteten Definition von UTF-8 basiert, als 5- und 6-Byte-Sequenzen zulässig waren, bevor die Ebenen 17 und höher gelöscht wurden. Und es impliziert, dass die Codepunkte U + FFFE und U + FFFF in UTF-8 ungültig sind, wenn dies laut Unicode-Konsortium nicht der
Fall ist
34

Siehe auch Woher weiß eine Datei mit chinesischen Zeichen, wie viele Bytes pro Zeichen verwendet werden sollen? - Ohne Zweifel gibt es andere SO-Fragen, die ebenfalls helfen würden.

In UTF-8 erhalten Sie die folgenden Arten von Bytes:

Binary    Hex          Comments
0xxxxxxx  0x00..0x7F   Only byte of a 1-byte character encoding
10xxxxxx  0x80..0xBF   Continuation bytes (1-3 continuation bytes)
110xxxxx  0xC0..0xDF   First byte of a 2-byte character encoding
1110xxxx  0xE0..0xEF   First byte of a 3-byte character encoding
11110xxx  0xF0..0xF4   First byte of a 4-byte character encoding

(Die letzte Zeile sieht so aus, als ob sie 0xF0..0xF7 lauten sollte. Der 21-Bit-Bereich von Unicode (U + 0000 - U + 10FFFF) bedeutet jedoch, dass der maximal gültige Wert 0xF4 ist. Werte 0xF5..0xF7 können in nicht auftreten gültiges UTF-8.)

Wenn Sie prüfen, ob eine bestimmte Folge von Bytes für UTF-8 gültig ist, müssen Sie über Folgendes nachdenken:

  • Fortsetzung Bytes erscheinen, wo nicht erwartet
  • Nichtfortsetzungsbytes werden dort angezeigt, wo ein Fortsetzungsbyte erwartet wird
  • Unvollständige Zeichen am Ende der Zeichenfolge (Variation des 'Fortsetzungsbytes erwartet')
  • Nicht minimale Sequenzen
  • UTF-16-Ersatz

In gültigem UTF-8 können die Bytes 0xF5..0xFF nicht vorkommen.

Nicht minimale Sequenzen

Für einige Zeichen gibt es mehrere mögliche Darstellungen. Beispielsweise könnte das Unicode-Zeichen U + 0000 (ASCII NUL) dargestellt werden durch:

0x00
0xC0 0x80
0xE0 0x80 0x80
0xF0 0x80 0x80 0x80

Der Unicode-Standard besagt jedoch eindeutig, dass die letzten drei Alternativen nicht akzeptabel sind, da sie nicht minimal sind. Es kommt daher vor, dass die Bytes 0xC0 und 0xC1 niemals in einem gültigen UTF-8 erscheinen können, da die einzigen Zeichen, die von diesen codiert werden könnten, minimal als Einzelbytezeichen im Bereich 0x00..0x7F codiert sind.

UTF-16-Ersatz

Innerhalb der Basic Multi-Lingual Plane (BMP) sind die Unicode-Werte U + D800 - U + DFFF für UTF-16-Surrogate reserviert und können nicht in gültigem UTF-8 codiert erscheinen. Wenn sie in UTF-8 gültig wären (was ich nicht betone), würden die Surrogate codiert:

  • U + D800 - 0xED 0xA0 0x80 (kleinster hoher Ersatz)
  • U + DBFF - 0xED 0xAF 0xBF (größter hoher Ersatz)
  • U + DC00 - 0xED 0xB0 0x80 (kleinster niedriger Ersatz)
  • U + DFFF - 0xED 0xBF 0xBF (größter niedriger Ersatz)

Schlechte Daten

Daher sollten Ihre BAD-Daten Proben enthalten, die gegen diese verschiedenen Vorschriften verstoßen.

  • Fortsetzungsbyte, dem keiner der Anfangsbytewerte vorangestellt ist
  • Anfangsbytes mit mehreren Zeichen, gefolgt von nicht genügend Fortsetzungsbytes
  • Nicht minimale Multi-Byte-Zeichen
  • UTF-16-Ersatz
  • Ungültige Bytes (0xC0, 0xC1, 0xF5..0xFF).

Beachten Sie, dass ein Byte-Order-Mark (BOM) U + FEFF, auch bekannt als No-Break-Space mit Nullbreite (ZWNBSP), in UTF-8 nicht unverschlüsselt erscheinen kann - die Bytes 0xFF und 0xFE sind in gültigem UTF-8 nicht zulässig. Ein codierter ZWNBSP kann in einer UTF-8-Datei als 0xEF 0xBB 0xBF angezeigt werden, aber die Stückliste ist in UTF-8 völlig überflüssig.


Es gibt auch einige Nicht- Zeichen in Unicode. U + FFFE und U + FFFF sind zwei solche Nichtzeichen (und die letzten beiden Codepunkte in jeder Ebene, U + 1FFFE, U + 1FFFF, U + 2FFFE, U + 2FFFF, ... U + 10FFFE, U + 10FFFF sind andere ). Diese sollten normalerweise nicht in Unicode-Daten für den Datenaustausch enthalten sein, sondern können im privaten Gebrauch angezeigt werden. Unter dem Unicode-FAQ-Link finden Sie viele schmutzige Details, einschließlich der ziemlich komplexen Geschichte von Nicht-Zeichen in Unicode. ( Berichtigung Nr. 9: Klarstellung über Nichtzeichen , die im Januar 2013 veröffentlicht wurde, macht das, was der Titel andeutet - verdeutlicht die Bedeutung von Nichtzeichen .)

Jonathan Leffler
quelle
Danke für diese tolle Liste. Ich habe vor, diese jetzt genauer zu untersuchen.
Xeoncross
3
Der Kommentar, dass Nicht-Zeichen "nicht in UTF-8-codierten Daten erscheinen sollten", ist irreführend. Nicht-Zeichen sollten nicht in UTF-8-codierten Daten erscheinen, die für den offenen Austausch vorgesehen sind , sollten jedoch von UTF-8-Codierern / -Decodierern akzeptiert werden
Simon Kissane
@SimonKissane: Anscheinend war ich einer der vielen, die durch den Status quo ante Corrigendum # 9 , der anscheinend im Januar 2013 veröffentlicht wurde, verwirrt waren . Der gesamte Abschnitt der Unicode-FAQ zu Nicht-Zeichen ist eine Lektüre wert. Danke für die Information. (Ich werde auch bemerken, dass meine Kommentare "sollte" sagen, was mit dem übereinstimmt, was der Unicode-Standard sagte (aber nicht "sagt"); die Absicht ist, dass sie nicht im "offenen Austausch" erscheinen sollten, sondern für den "internen Gebrauch" verwendet werden können '.)
Jonathan Leffler
1
@AdrianMaire: Siehe Tabelle 3.6 in Kapitel 3 des Unicode-Standards (9.0.0) (Seitenzahl 125; S. 54 der PDF-Datei). Ich bin mir nicht sicher, welche anderen Quellen Sie konsultieren, aber ich denke, was ich gesagt habe, wird in dieser Tabelle behandelt.
Jonathan Leffler
@ JonathanLeffler Du bist 100% korrekt, Danke für den Hinweis.
Adrian Maire
17

Mit diesem praktischen Online-Tool von Jeffrey Bergamini können Sie jeden Text in eine wirklich seltsame UTF8-Folge von Homoglyphen konvertieren.

Ein typischer

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.

so werden:

Ḽơᶉëᶆ ȋṕšᶙṁ ḍỡḽǭᵳ ʂǐť ӓṁệẗ, ĉṓɲṩḙċťᶒţûɾ ấɖḯƥĭṩčįɳġ ḝłįʈ, şếᶑ ᶁⱺ ẽḭŭŝḿꝋď ṫĕᶆᶈṓɍ ỉñḉīḑȋᵭṵńť Ut ḹẩḇőꝛế éȶ đꝍꞎôꝛȇ ᵯáꞡᶇā ąⱡîɋṹẵ.

Shebuka
quelle
6
Ich nehme an, das liegt daran, dass dies beim Testen von UTF8 nicht wirklich hilft: Sie erhalten nichts in der Nähe des gesamten Satzes von Fällen, es gibt keine "schlechten" Fälle und das Format ist für das Testen nicht wirklich hilfreich. Es ist nur ein Weg, um seltsame Charaktere zu bekommen.
Adrian Maire
Hast du es versucht? Dieser Generator ist nicht zum Spaß. Es gibt Ihnen Zeichen aus dem gesamten UTF-8-Bereich, und da sie den tatsächlichen Zeichen seltsamerweise ähnlich sind, können Sie sehen, welche Zeichen Ihnen Probleme bereiten. In dem Beispiel, das ich gepostet habe, gibt es 6 Zeichen, die mein iPhone als Fragezeichen in Kästchen rendert.
Shebuka
4
IMO, dieses wunderbare Tool hätte ein sehr schöner "Mehrwert" für eine Erklärung sein können, passt aber nicht als Antwort für sich in SO (auch weil die Seite möglicherweise eingestellt wird). Wie auch immer, ich stimme zu, dass ein -1 ohne Erklärung nicht sehr konstruktiv ist.
Adrian Maire
Das sind also "gute, gute utf-8-Beispieltestdaten" ... eine positive Bewertung wert, IMO
Rondo
2

Aus dem Kopf:

0xff und 0xfe

Einzelne High-Bit-Bytes

Multi-Byte-Darstellung von Low-Byte-Zeichen - Eine gute Möglichkeit, Nullen nach frühen Überprüfungen zu schmuggeln

Byte-Order-Markierungen - Werden Sie sie ignorieren?

NFC gegen NFD

Douglas Leeder
quelle