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