Преобразование кодовых точек Unicode в UTF-8 настолько тривиально, что для вызова библиотеки, вероятно, потребуется больше кода, чем просто сделать это самостоятельно:
if (c<0x80) *b++=c;
else if (c<0x800) *b++=192+c/64, *b++=128+c%64;
else if (c-0xd800u<0x800) goto error;
else if (c<0x10000) *b++=224+c/4096, *b++=128+c/64%64, *b++=128+c%64;
else if (c<0x110000) *b++=240+c/262144, *b++=128+c/4096%64, *b++=128+c/64%64, *b++=128+c%64;
else goto error;
Кроме того, выполнение этого самостоятельно означает, что вы можете настроить API-интерфейс для нужного вам типа работы (символьный за раз? Или длинных строк?). Вы можете удалить случаи ошибок, если знаете, что введенный вами код является допустимым Unicode. скалярное значение.
Другое направление сложнее понять. Я рекомендую подход с конечным автоматом, а не типичные битовые арифметические циклы, которые иногда декодируют недопустимые последовательности как псевдонимы для реальных символов (что очень опасно и может привести к проблемам с безопасностью).
Редактировать: Даже если вы в конечном итоге пойдете с библиотекой, я думаю, вам следует либо сначала попробовать написать ее самостоятельно, либо, по крайней мере, серьезно изучить спецификацию UTF-8, прежде чем идти дальше. Много плохого дизайна может возникнуть из-за того, что UTF-8 рассматривается как черный ящик, когда весь смысл в том, что он не черный, а создан с очень мощными свойствами, и слишком многие программисты, не знакомые с UTF-8, не видят этого до они сами много с этим работали.