Вы можете использовать эту функцию, которая принимает кодовую точку UTF-32 для преобразования в ее эквивалентную кодовую точку UTF-16 (одиночную или суррогатную в зависимости от обстоятельств) в качестве первого аргумента, а суррогаты высокого и низкого значений - в качестве второго и третьего аргументов ,
Высокие и низкие суррогатные значения возвращаются по ссылке.
Если кодовая точка меньше 0x10000, то мы просто возвращаем эту кодовую точку в нижнем суррогате по ссылке, в то время как верхний суррогат равен 0.
Если кодовая точка больше 0x10000, то мы рассчитываем верхнюю и нижнюю суррогатные пары, используя правила, приведенные на этой странице википедии:
https://en.wikipedia.org/wiki/UTF-16#Example_UTF-16_encoding_procedure
Вот код:
unsigned int convertUTF32ToUTF16(unsigned int cUTF32, unsigned int &h, unsigned int &l)
{
if (cUTF32 < 0x10000)
{
h = 0;
l = cUTF32;
return cUTF32;
}
unsigned int t = cUTF32 - 0x10000;
h = (((t<<12)>>22) + 0xD800);
l = (((t<<22)>>22) + 0xDC00);
unsigned int ret = ((h<<16) | ( l & 0x0000FFFF));
return ret;
}