Zobacz także Skąd plik zawierający znaki chińskie wie, ile bajtów użyć na znak? - bez wątpienia są inne pytania SO, które również by pomogły.
W UTF-8 otrzymujesz następujące typy bajtów:
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
(Ostatnia linia wygląda tak, jakby miała czytać 0xF0..0xF7; jednak 21-bitowy zakres Unicode (U + 0000 - U + 10FFFF) oznacza, że maksymalna poprawna wartość to 0xF4; wartości 0xF5..0xF7 nie mogą wystąpić w ważny UTF-8.)
Sprawdzanie, czy dana sekwencja bajtów jest prawidłowa UTF-8 oznacza, że musisz pomyśleć o:
- Bajty kontynuacyjne pojawiają się tam, gdzie nie są oczekiwane
- Bajty bez kontynuacji pojawiają się tam, gdzie oczekiwany jest bajt kontynuacji
- Niekompletne znaki na końcu ciągu (odmiana „oczekiwano bajtu kontynuacji”)
- Sekwencje nie-minimalne
- Surogaty UTF-16
W prawidłowym UTF-8 bajty 0xF5..0xFF nie mogą wystąpić.
Sekwencje nie-minimalne
Istnieje wiele możliwych reprezentacji niektórych postaci. Na przykład znak Unicode U + 0000 (ASCII NUL) może być reprezentowany przez:
0x00
0xC0 0x80
0xE0 0x80 0x80
0xF0 0x80 0x80 0x80
Jednak standard Unicode wyraźnie stwierdza, że ostatnie trzy alternatywy są niedopuszczalne, ponieważ nie są minimalne. Tak się składa, że bajty 0xC0 i 0xC1 nigdy nie mogą pojawić się w prawidłowym UTF-8, ponieważ jedyne znaki, które mogą być przez nie zakodowane, są minimalnie zakodowane jako znaki jednobajtowe z zakresu 0x00..0x7F.
Surogaty UTF-16
W Basic Multi-Lingual Plane (BMP) wartości Unicode U + D800 - U + DFFF są zarezerwowane dla surogatów UTF-16 i nie mogą pojawić się zakodowane w prawidłowym UTF-8. Gdyby były ważne w UTF-8 (co, podkreślam, nie są), to surogaty byłyby kodowane:
- U + D800 - 0xED 0xA0 0x80 (najmniejszy wysoki surogat)
- U + DBFF - 0xED 0xAF 0xBF (największy wysoki surogat)
- U + DC00 - 0xED 0xB0 0x80 (najmniejszy niski surogat)
- U + DFFF - 0xED 0xBF 0xBF (największy niski surogat)
Złe dane
Twoje dane BAD powinny więc zawierać próbki naruszające te różne zalecenia.
- Bajt kontynuacji nie jest poprzedzony żadną z początkowych wartości bajtu
- Wieloznakowe bajty początkowe zabrakło wystarczającej liczby bajtów kontynuacji
- Inne niż minimalne znaki wielobajtowe
- Surogaty UTF-16
- Nieprawidłowe bajty (0xC0, 0xC1, 0xF5..0xFF).
Należy zauważyć, że znacznik kolejności bajtów (BOM) U + FEFF, inaczej spacja bez przerwy o zerowej szerokości (ZWNBSP), nie może pojawić się jako niezakodowany w UTF-8 - bajty 0xFF i 0xFE nie są dozwolone w prawidłowym UTF-8. Zakodowany ZWNBSP może pojawić się w pliku UTF-8 jako 0xEF 0xBB 0xBF, ale BOM jest całkowicie zbędny w UTF-8.
W Unicode jest również kilka znaków niebędących znakami . U + FFFE i U + FFFF to dwa takie nie-znaki (a ostatnie dwa punkty kodowe w każdej płaszczyźnie, U + 1FFFE, U + 1FFFF, U + 2FFFE, U + 2FFFF, ... U + 10FFFE, U + 10FFFF to inne ). Nie powinny one normalnie pojawiać się w danych Unicode do wymiany danych, ale mogą pojawiać się do użytku prywatnego. Zobacz link do często zadawanych pytań na temat Unicode, aby uzyskać wiele obskurnych szczegółów, w tym dość złożoną historię znaków niebędących znakami w Unicode. ( Sprostowanie nr 9: Wyjaśnienie dotyczące znaków niebędących postaciami , które zostało wydane w styczniu 2013 r., Robi to, co sugeruje jego tytuł - wyjaśnia znaczenie niebędących postaciami.)