UTF32をUTF16に変換します。0x10000以上のコードはサロゲートペアとして変換します。
#include <stdio.h> #include <tchar.h> #include <locale.h> #include <iostream> #include <windows.h> /* UTF32をUTF16に変換する */ std::wstring UTF32toUTF16 ( ULONG qUtf32 // UTF32コード ) { WCHAR waBuf[ 4 ] = { 0 }; if ( 0x10000 > qUtf32 ) { // 0x10000未満 waBuf[ 0 ] = (WCHAR)qUtf32; } else { // 0x10000以上(サロゲートペアにする) waBuf[ 0 ] = (WCHAR)( ( qUtf32 - 0x10000 ) / 0x400 + 0xd800 ); waBuf[ 1 ] = (WCHAR)( ( qUtf32 - 0x10000 ) % 0x400 + 0xdc00 ); } // 処理結果を返す return( waBuf ); } /* UTF32をUTF16に変換する */ int _tmain ( int argc , _TCHAR* argv[] ) { // std::wcoutのロケールを設定 std::wcout.imbue( std::locale( "", std::locale::ctype ) ); // UTF16変換結果 std::wstring strUtf16; // UTF32をUTF16に変換する strUtf16 += UTF32toUTF16( 0x00002605 ); strUtf16 += UTF32toUTF16( 0x00020628 ); strUtf16 += UTF32toUTF16( 0x0001f300 ); // 結果表示 for ( UINT nI = 0; nI < strUtf16.size(); nI++ ) { wprintf( L"[%d] -> 0x%04x¥n", nI, strUtf16[ nI ] ); } // 処理結果を返す return( 0 ); }
[0] -> 0x2605 [1] -> 0xd841 [2] -> 0xde28 [3] -> 0xd83c [4] -> 0xdf00