UTF-8 ist eine relativ einfache Methode zum Codieren von Unicode-Codepunkten in einem Format mit variabler Breite, sodass Code, der nicht Unicode-fähig ist, nicht leicht verwechselt werden kann.
UTF-8 Übersicht
- Bytes im Bereich von 1-0x7F einschließlich sind normalerweise gültig
- Bytes mit dem Bitmuster
10XX XXXXwerden als Fortsetzungsbytes betrachtet, wobei die sechs niedrigstwertigen Bits zum Codieren eines Teils eines Codepunkts verwendet werden. Diese dürfen nur angezeigt werden, wenn sie von einem vorhergehenden Byte erwartet werden. - Bytes mit dem Muster
110X XXXXerwarten danach ein Fortsetzungsbyte - Bytes mit dem Muster
1110 XXXXerwarten danach zwei Fortsetzungsbytes - Bytes mit dem Muster
1111 0XXXerwarten danach drei Fortsetzungsbytes - Alle anderen Bytes sind ungültig und sollten nirgendwo in einem UTF-8-Stream erscheinen. 5-, 6- und 7-Byte-Cluster sind theoretisch möglich, werden jedoch für die Zwecke dieser Herausforderung nicht zugelassen.
Überlange Codierungen
UTF-8 erfordert auch, dass ein Codepunkt mit der Mindestanzahl von Bytes dargestellt wird. Jede Bytesequenz, die mit weniger Bytes dargestellt werden könnte, ist ungültig. Modifiziertes UTF-8 fügt eine Ausnahme für Nullzeichen (U + 0000) hinzu, die als C0 80(Hex-Darstellung) dargestellt werden sollten, und verhindert stattdessen, dass Null-Bytes irgendwo im Stream angezeigt werden. (Dies macht es kompatibel mit nullterminierten Zeichenfolgen)
Herausforderung
Sie müssen ein Programm erstellen, das bei Angabe einer Byte-Zeichenfolge feststellt, ob diese Zeichenfolge ein gültiges modifiziertes UTF-8 darstellt, und ansonsten einen Wahrheitswert und einen Falschwert zurückgibt. Beachten Sie, dass Sie nach überlangen Codierungen und Null-Bytes suchen müssen (da dies Modified UTF-8 ist). Sie müssen die UTF-8-Werte nicht dekodieren.
Beispiele
41 42 43 ==> yes (all bytes are in the 0-0x7F range)
00 01 02 ==> no (there is a null byte in the stream)
80 7F 41 ==> no (there is a continuation byte without a starter byte)
D9 84 10 ==> yes (the correct number of continuation bytes follow a starter byte)
F0 81 82 41 ==> no (there are not enough continuation bytes after F0)
EF 8A A7 91 ==> no (too many continuation bytes)
E1 E1 01 ==> no (starter byte where a continuation byte is expected)
E0 80 87 ==> no (overlong encoding)
41 C0 80 ==> yes (null byte encoded with the only legal overlong encoding)
F8 42 43 ==> no (invalid byte 'F8')
Regeln
- Es gelten Standardregeln und Lücken
- Die Ein- und Ausgabe kann in jedem geeigneten Format erfolgen, solange alle Werte im vorzeichenlosen Bytebereich (0-255) eingelesen werden können.
- Möglicherweise müssen Sie ein Array oder eine Datei anstelle einer nullterminierten Zeichenfolge verwenden. Sie müssen in der Lage sein, Null-Bytes zu lesen.
- Der kürzeste Code gewinnt!
- Beachten Sie, dass die Verwendung von integrierten Funktionen zum Decodieren des UTF-8 nicht den hier angegebenen Anforderungen entspricht. Möglicherweise müssen Sie es umgehen und Sonderfälle erstellen.
BEARBEITEN: Zusätzlicher Bonus für die Nichtverwendung von integrierten Funktionen, die UTF-8 dekodieren
EDIT2: Bonus entfernt, da nur die Rust-Antwort qualifiziert ist und es umständlich zu definieren ist.