2006年05月14日

Shift_JISとUnicodeの変換用関数

環境
Visual C++.NET 2003

Windows上でShift_JISのようなマルチバイト文字とUnicodeとの変換を行う関数を紹介します。
これはMFCやATLが使えない場合の関数です(例えばVisual C++ 2005 Express Edition使用時のように)。 MFCが使えればCStringを使うべきですし、ATLを使えばCW2AやCA2Wを使うべきでしょう。

まずはUnicodeからマルチバイト文字への変換関数です。

std::string UnicodeToMultiByte(const std::wstring& Source, UINT CodePage = CP_ACP, DWORD Flags = 0);

std::string UnicodeToMultiByte(const std::wstring& Source, UINT CodePage, DWORD Flags)
{
  if (int Len = ::WideCharToMultiByte(CodePage, Flags, Source.c_str(), static_cast<int>(Source.size()), NULL, 0, NULL, NULL)) {
    std::vector<char> Dest(Len);
    if (Len = ::WideCharToMultiByte(CodePage, Flags, Source.c_str(), static_cast<int>(Source.size()), &Dest[0], static_cast<int>(Dest.size()), NULL, NULL)) {
      return std::string(Dest.begin(), Dest.begin() + Len);
    }
  }
  return "";
}

でもってこれがマルチバイト文字からUnicodeへの変換用関数です。

std::wstring MultiByteToUnicode(const std::string& Source, UINT CodePage = CP_ACP, DWORD Flags = 0);

std::wstring MultiByteToUnicode(const std::string& Source, UINT CodePage, DWORD Flags)
{
  if (int Len = ::MultiByteToWideChar(CodePage, Flags, Source.c_str(), static_cast<int>(Source.size()), NULL, 0)) {
    std::vector<wchar_t> Dest(Len);
    if (Len = ::MultiByteToWideChar(CodePage, 0, Source.c_str(), static_cast<int>(Source.size()), &Dest[0], static_cast<int>(Dest.size()))) {
      return std::wstring(Dest.begin(), Dest.begin() + Len);
    }
  }
  return L"";
}

しかしこういう定型処理を行う関数は自前で作るものじゃないですね。boostにはないんですかねぇ・・・。

(2008/02/12追記)上記変換関数のバージョンアップ版を作成しました。

投稿者 MASATO : 2006年05月14日 21:31 | トラックバック
コメント
コメントする









名前、アドレスを登録しますか?