Imho Presume 8 bit, encapsulting 7bit usacsii. That includes utf8 and many many other encodings.
Don't interpret user supplied strings at all. Defines max lengths as byte lengths.
Remain agnostic of encoding. Especially in libraries.
It's easier than people think it is thanks to some very clever people's work a long time ago.