UTF-8 - це досить простий спосіб кодування точок коду Unicode у форматі змінної ширини, таким чином, що він не може легко сплутати код, про який не знає Unicode.
Огляд UTF-8
- Байти в діапазоні 1-0x7F включно, як правило, дійсні
- Байти з бітовим малюнком
10XX XXXXвважаються байтами продовження, при цьому шість найменш значущих бітів використовуються для кодування частини кодової точки. Вони не повинні з'являтися, якщо їх не очікує попередній байт. - Байти з візерунком
110X XXXXочікують одного байта продовження після цього - Байти з малюнком
1110 XXXXочікують два наступні байти - Байти з малюнком
1111 0XXXочікують три байти продовження - Усі інші байти є недійсними і не повинні з’являтися ніде в потоці UTF-8. Теоретично можливі кластери 5, 6 і 7 байтів, але це не буде дозволено для цілей цього виклику.
Надмірне кодування
UTF-8 також вимагає, щоб кодова точка була представлена мінімальною кількістю байтів. Будь-яка послідовність байтів, яка могла бути представлена меншою кількістю байтів, не є дійсною. Модифікований UTF-8 додає один виняток до цього для нульових символів (U + 0000), який має бути представлений у вигляді C0 80(шістнадцяткове представлення)), а замість цього забороняє нульові байти з’являтися в будь-якому місці потоку. (Це робить його сумісним з нульовими строками)
Виклик
Ви повинні створити програму, яка при наданні рядка байтів визначить, чи є ця строка дійсною Модифікованою UTF-8 і поверне триєдине значення, якщо дійсне, а фальш-значення - інакше. Зауважте, що ви повинні перевірити наявність довгих кодувань та нульових байтів (оскільки це модифікований UTF-8). Вам не потрібно розшифровувати значення UTF-8.
Приклади
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')
Правила
- Застосовуються стандартні правила та лазівки
- Введення та вихід можуть бути у будь-якому зручному форматі до тих пір, поки всі значення в діапазоні непідписаних байтів (0-255) можуть бути прочитані.
- Можливо, вам доведеться використовувати масив або файл, а не рядок з нульовим завершенням. Потрібно вміти читати нульові байти.
- Найкоротший код виграє!
- Зауважте, що використання вбудованих файлів для декодування UTF-8 не гарантовано відповідає вимогам, наведеним тут. Можливо, вам доведеться обійтись і створити спеціальні кейси.
EDIT: доданий бонус за невикористання вбудованих файлів, які декодують UTF-8
EDIT2: вилучено бонус, оскільки лише відповідь "Іржа" кваліфікована, і визначити це незручно.