WindowsプログラマのWebアプリへの挑戦日記。あとパンとか。

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

の順番で変換する必要があります。

以下が変換のコードです。エラー処理は省略しています。

  1. BOOL ConvUtf8toSJis( BYTE* pSource, BYTE* pDist, int* pSize )
  2. {
  3.    *pSize = 0;
  4.  
  5.    //UTF-8からUTF-16へ変換
  6.    const int nSize = ::MultiByteToWideChar( CP_UTF8, 0, (LPCSTR)pSource, -1, NULL, 0 );
  7.  
  8.    BYTE* buffUtf16 = new BYTE[ nSize * 2 + 2 ];
  9.    ::MultiByteToWideChar( CP_UTF8, 0, (LPCSTR)pSource, -1, (LPWSTR)buffUtf16, nSize );
  10.  
  11.    //UTF-16からShift-JISへ変換
  12.    const int nSizeSJis = ::WideCharToMultiByte( CP_ACP, 0, (LPCWSTR)buffUtf16, -1, NULL, 0, NULL, NULL );
  13.    if( !pDist ){
  14.        *pSize = nSizeSJis;
  15.        delete buffUtf16;
  16.        return TRUE;
  17.    }
  18.  
  19.    BYTE* buffSJis = new BYTE[ nSizeSJis * 2 ];
  20.    ZeroMemory( buffSJis, nSizeSJis * 2 );
  21.    ::WideCharToMultiByte( CP_ACP, 0, (LPCWSTR)buffUtf16, -1, (LPSTR)buffSJis, nSizeSJis, NULL, NULL );
  22.  
  23.    *pSize = lstrlen( (char*)buffSJis );
  24.    memcpy( pDist, buffSJis, *pSize );
  25.  
  26.    delete buffUtf16;
  27.    delete buffSJis;
  28.  
  29.    return TRUE;
  30. }

この関数の使用方法は、まずはじめにpDistにNULLを渡して変換後のサイズを取得します。変換後のサイズでpDistのメモリを確保したあと、もう一度この関数を呼びます。

次のような感じ。

  1. int nSize = 0;
  2. ConvSJisToUtf8( pSource, NULL, &nSize );
  3. BYTE* pDist = new BYTE[ nSize + 1 ];
  4. ZeroMemory( pDist, nSize + 1 );
  5. ConvSJisToUtf8( pSource, pDist, &nSize );

次回はBase64変換について書きます。

こちらもオススメ!

Trackback URL

Post a Comment