Я считаю, что официальный путь по-прежнему должен идти в сторону codecvt
граней (вам нужен какой-то перевод, ориентированный на языковой стандарт), как в
resultCode = use_facet<codecvt<char, wchar_t, ConversionState> >(locale).
in(stateVar, scratchbuffer, scratchbufferEnd, from, to, toLimit, curPtr);
или что-то в этом роде, я не есть рабочий код, лежащий вокруг. Но я не уверен, сколько людей в эти дни используют эту технику, и сколько попросят указать указатели на память, и пусть ICU или другая библиотека обрабатывают детали gory.