If your looking for a C implementation (usable with C++) that handles UTF-8 quite well and is also very small, you could also have a look here:
How to uppercase/lowercase UTF-8 characters in C++?
These C-functions can be easily wrapped for use with std::string.
I'm not saying this is the most robust way, after all, all the problems with std::string will remain, but it could be helpful in some use cases.