начинаем читать входную строку байт. Пока она utf-8, преобразуем utf-8 в UTF-32 и кладём в выходную строку из симв32 (слов 32-битных).
Как только встречается неверная последовательность из N байт, превращаем каждый из этих байт в значение UCS-4 (32-битное слово), равное
Код: Выделить всё
БазаНеверныхБайт + значениеБайтаКакБеззнаковоеЦелое
Переход обратно к кодировке UTF-8 происходит при восстановлении utf-8.
При этом количество символов UCS-4 для кодировки любой строки байт не превосходит количества байт. Остаются вопросы:
* на сколько байт вперёд надо смотреть
* какого размера буфер нужен для раскодировки
* более точный выбор базы неверных байт
* в т.ч. в ЯОС. В википедии написано, что UCS-4 используется в редакторах и там какие-то из значений, лежащих за пределами юникода, могут быть уже заняты. Соответственно, надо найти эти значения в ЯОС, если они есть.