Нужно было написать свои собственные функции работы с UTF-8, поэтому полез на википедию читать описание формата и удивился какой он странный.
Почему нельзя было сделать так:
1) Если старший бит байта сброшен, то берём его как есть.
2) Если установлен, то сдвигаем предыдущее значение на 7 бит и добавляем младшие 7 бит байта.
То есть итерация по символам выглядела бы так:
char *str = ...;
int code = -1;
while (1) {
if (*str < 0x80) {
if (code != -1) {
// Тут мы работаем с Unicode символом code
}
code = *str;
if (code == 0) break;
} else {
code <<= 7;
code |= *str & 0x7F;
}
}
Плюсы: алгоритм обработки прост до безобразия, не нужно беспокоится о проверке на корректность (если про это забыть в случае с UTF-8, а кто-то обрежет строку по середине символа, то приложение может упасть), символы пакуются ещё компактнее, нет ограничения на размер символа (вдруг кому-нибудь когда-нибудь станет мало UTF32 и появится UTF64 - в моём коде достаточно будет заменить int на long long).
Почему авторы стандарта не догадались до такой простой идеи и нагородили очень странные вещи? Или есть какие-то причины по которой тот вариант лучше того, что выше?