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
の順番で変換する必要があります。
以下が変換のコードです。エラー処理は省略しています。
- 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のメモリを確保したあと、もう一度この関数を呼びます。
次のような感じ。
- int nSize = 0;
- ConvSJisToUtf8( pSource, NULL, &nSize );
- BYTE* pDist = new BYTE[ nSize + 1 ];
- ZeroMemory( pDist, nSize + 1 );
- ConvSJisToUtf8( pSource, pDist, &nSize );
次回はBase64変換について書きます。
こちらもオススメ!