window下 ANSI Unicode utf8之间相互转换

//CString to string的转可能只适用于某些编码情况
string CStringToChar(const CString& strSrc)
{
  CString strTmp(strSrc);
  string str(strTmp.GetBuffer(strTmp.GetLength()));
  strTmp.ReleaseBuffer();
  return str;
}

wstring AnsiToUnicode(const string& buf)
{
  int len = ::MultiByteToWideChar(CP_ACP, 0, buf.c_str(), -1, NULL, 0);
  if (len == 0) return L"";

  wstring strUnicode;
  strUnicode.resize(len);
  ::MultiByteToWideChar(CP_ACP, 0, buf.c_str(), -1, (wchar_t*)strUnicode.c_str(), len);

  return strUnicode;
}

string UnicodeToAnsi(const wstring& buf)
{
  int len = ::WideCharToMultiByte(CP_ACP, 0, buf.c_str(), -1, NULL, 0, NULL, NULL);
  if (len == 0) return "";

  string strUtf8;
  strUtf8.resize(len);
  ::WideCharToMultiByte(CP_ACP, 0, buf.c_str(), -1, (char*)strUtf8.c_str(), len, NULL, NULL);

  return strUtf8;
}

wstring Utf8ToUnicode(const string& buf)
{
  int len = ::MultiByteToWideChar(CP_UTF8, 0, buf.c_str(), -1, NULL, 0);
  if (len == 0) return L"";

  wstring strUnicode;
  strUnicode.resize(len);
  ::MultiByteToWideChar(CP_UTF8, 0, buf.c_str(), -1, (wchar_t*)strUnicode.c_str(), len);

  return strUnicode;
}

string UnicodeToUtf8(const wstring& buf)
{
  int len = ::WideCharToMultiByte(CP_UTF8, 0, buf.c_str(), -1, NULL, 0, NULL, NULL);
  if (len == 0) return "";

  string strUtf8;
  strUtf8.resize(len);
  ::WideCharToMultiByte(CP_UTF8, 0, buf.c_str(), -1, (char*)strUtf8.c_str(), len, NULL, NULL);

  return strUtf8;
}

string AnsiToUtf8(const string& strSrc)
{
  return UnicodeToUtf8(AnsiToUnicode(strSrc));
}

string AnsiToUtf8(const CString& strSrc)
{
  return UnicodeToUtf8(AnsiToUnicode(CStringToChar(strSrc)));
}

posted @ 2017-02-16 16:27  当你的世界里有风吹过  阅读(765)  评论(0编辑  收藏  举报