Currently we store our string internally as UTF8 and we do operations between UTF8 strings. The cool thing about UTF8 is that they work perfectly with std::string(or in out cause a lagacy string class that was implemented around char*) (as the 0 will be found only at the end of the file).
Under windows we convert to UNICODE/MBCS when needed(example is winapi specific function as OpenFile, SendMessage, CreateWindow...)
The unix based platforms already use utf8 as a native string.
Actually a good starting point would be to do what the guys form Autodesk Maya do with their MString (see MString::asChar method(it returns the string value in a platform native format)).
BTW a side hint:
In the MSVS in the debugger's watch windows if you type "mystringVariable, s8" the value of "mystringVariable" is going to be display as UTF8 string an not as a MBCS string