C++でUTF-8をShift-JISに変換する
6月 25th, 2008 Posted in C++前回、Shift-JISをUTF-8に変換する方法を書きました。今回は逆のUTF-8をShift-JISに変換する方法です。
この変換も、
UTF-8→UTF-16→Shift-JIS
の順番で変換する必要があります。
以下が変換のコードです。エラー処理は省略しています。
C++:
-
BOOL ConvUtf8toSJis( BYTE* pSource, BYTE* pDist, int* pSize )
-
{
-
*pSize = 0;
-
-
//UTF-8からUTF-16へ変換
-
const int nSize = ::MultiByteToWideChar( CP_UTF8, 0, (LPCSTR)pSource, -1, NULL, 0 );
-
-
BYTE* buffUtf16 = new BYTE[ nSize * 2 + 2 ];
-
::MultiByteToWideChar( CP_UTF8, 0, (LPCSTR)pSource, -1, (LPWSTR)buffUtf16, nSize );
-
-
//UTF-16からShift-JISへ変換
-
const int nSizeSJis = ::WideCharToMultiByte( CP_ACP, 0, (LPCWSTR)buffUtf16, -1, NULL, 0, NULL, NULL );
-
if( !pDist ){
-
*pSize = nSizeSJis;
-
delete buffUtf16;
-
return TRUE;
-
}
-
-
BYTE* buffSJis = new BYTE[ nSizeSJis * 2 ];
-
ZeroMemory( buffSJis, nSizeSJis * 2 );
-
::WideCharToMultiByte( CP_ACP, 0, (LPCWSTR)buffUtf16, -1, (LPSTR)buffSJis, nSizeSJis, NULL, NULL );
-
-
*pSize = lstrlen( (char*)buffSJis );
-
memcpy( pDist, buffSJis, *pSize );
-
-
delete buffUtf16;
-
delete buffSJis;
-
-
return TRUE;
-
}
この関数の使用方法は、まずはじめにpDistにNULLを渡して変換後のサイズを取得します。変換後のサイズでpDistのメモリを確保したあと、もう一度この関数を呼びます。
次のような感じ。
C++:
-
int nSize = 0;
-
ConvSJisToUtf8( pSource, NULL, &nSize );
-
BYTE* pDist = new BYTE[ nSize + 1 ];
-
ZeroMemory( pDist, nSize + 1 );
-
ConvSJisToUtf8( pSource, pDist, &nSize );
次回はBase64変換について書きます。
こちらもオススメ!
