[C++] const char* とconst wchar_t*の相互変換

Python/C APIでよく使うため関数をリサーチしました。2011年のStackOverflow英語版等にいい関数がありましたので拝借します。なおサロゲートペアには対応していません。

サロゲートペア:1つの文字に対して2つの文字コードを使って表される文字。𠀋 𡈽 𡌛 𡑮 𡢽 𠮟 𡚴 𡸴 𣇄 𣗄など。

const wchar_t* GetWC(const char* c) {
    const size_t cSize = strlen(c)+1;
    wchar_t* wc = new wchar_t[cSize];
    mbstowcs (wc, c, cSize);

    return wc;
    delete [] wc;
}

--------------------------------------------------
// stringへの変換(charは"string.c_str()")

std::string GetStr(const wchar_t* c) {

  std::string tmps;

  if (c == nullptr)
    return tmps;

  size_t sz = wcslen(c);

  tmps.reserve(sz*2);

  const size_t CNT_MAX = 50;
  char tmpc[CNT_MAX];
  wchar_t tmpw[CNT_MAX];

  const wchar_t* p = c;
  while (*p) {
    wcsncpy(tmpw, p, 1);
    tmpw[1] = L'\0';
    p += 1;
    
    wcstombs(tmpc, tmpw, CNT_MAX);
    tmps += tmpc;
  }
  
  return tmps;
}

setlocale(LC_ALL, ""); // GetC関数使用の際に必要

マルチバイト文字対策とは言えワイド文字wchar_tの存在は何ともやっかいです。

参考サイト
参考サイト2