Встраивание юникода в строковые литералы, как правило, не очень хорошая идея и не переносимо; нет никакой гарантии, что wchar_t будет 16 бит и что кодировка будет UTF-16. Хотя это может иметь место в Windows с Microsoft Visual C ++ (конкретная реализация C ++), wchar_t является 32-битным в GCC OS X (другая реализация). Если у вас есть какие-то локализованные строковые константы, лучше использовать файл конфигурации в какой-то конкретной кодировке и интерпретировать их как закодированные в этой кодировке. Библиотека International Components for Unicode (ICU) обеспечивает довольно хорошую поддержку для интерпретации и обработки юникода. Еще одна хорошая библиотека для преобразования (но не интерпретации) форматов кодирования: libiconv .
Редактировать
Возможно, я неверно истолковал ваш вопрос ... если проблема в том, что у вас уже есть строка в UTF-16, и вы хотите преобразовать ее в "unicode-escape ASCII" (то есть строку ASCII, где символы Unicode представлены как «\ u», за которым следует числовое значение символа), затем используйте следующий псевдокод:
for each codepoint represented by the UTF-16 encoded string:
if the codepoint is in the range [0,0x7F]:
emit the codepoint casted to a char
else:
emit "\u" followed by the hexadecimal digits representing codepoint
Теперь, чтобы получить кодовую точку, существует очень простое правило ... каждый элемент в строке UTF-16 является кодовой точкой, если только он не является частью «суррогатной пары», в этом случае он и элемент после он включает в себя одну кодовую точку. Если это так, то стандарт Unicode определяет процедуру объединения «ведущего суррогата» и «конечного суррогата» в одну кодовую точку. Обратите внимание, что UTF-8 и UTF-16 являются кодировками переменной длины ... кодовая точка требует 32 бита, если не представлена с переменной длиной. В часто задаваемых вопросов Unicode Transformation Format (UTF) объясняется кодирование, а также способы идентификации суррогатных пар и способы их объединения в кодовые точки.