文字列リテラルに Unicode を埋め込むことは、一般的には良い考えではなく、移植性がありません。wchar_t が 16 ビットになり、エンコーディングが UTF-16 になるという保証はありません。Microsoft Visual C++ (特定の C++ 実装) を使用する Windows ではこれが当てはまりますが、OS X の GCC (別の実装) では wchar_t は 32 ビットです。ある種のローカライズされた文字列定数がある場合は、構成ファイルを特定のエンコーディングで使用し、それらをそのエンコーディングでエンコードされたものとして解釈するのが最善です。International Components for Unicode (ICU)ライブラリは、Unicodeの解釈と処理をかなり適切にサポートします。エンコーディング形式を変換する (解釈はしない) ためのもう 1 つの優れたライブラリはlibiconvです。
編集
あなたの質問を誤解している可能性があります...問題がすでにUTF-16の文字列を持っていて、それを「unicode-escape ASCII」(つまり、Unicode文字が表されるASCII文字列)に変換したい場合"\u" の後に文字の数値が続く)、次の疑似コードを使用します。
UTF-16 でエンコードされた文字列で表される各コードポイントに対して:
コードポイントが [0,0x7F] の範囲にある場合:
char にキャストされたコードポイントを発行する
そうしないと:
「\u」の後にコードポイントを表す 16 進数を出力する
ここで、コードポイントを取得するには、非常に単純なルールがあります... UTF-16 文字列の各要素は、「サロゲート ペア」の一部でない限り、コードポイントです。単一のコードポイント。その場合、Unicode 標準では、「先頭のサロゲート」と「末尾のサロゲート」を単一のコード ポイントに結合するための手順が定義されています。UTF-8 と UTF-16 は両方とも可変長エンコーディングであることに注意してください...可変長で表されない場合、コードポイントには 32 ビットが必要です。Unicode Transformation Format (UTF) FAQでは、エンコーディング、サロゲート ペアの識別方法、それらをコードポイントに結合する方法について説明しています。