web-dev-qa-db-ja.com

wchar_t *をstd :: stringに変換するにはどうすればよいですか?

クラスを変更してstd :: stringを使用しました(得られた答えに基づいて here ですが、関数がwchar_t *を返します。どうすればstd :: stringに変換できますか?

私はこれを試しました:

std::string test = args.OptionArg();

エラーC2440: 'initializing': 'wchar_t *'から 'std :: basic_string <_Elem、_Traits、_Ax>'に変換できません

30
codefrog

単にwstringを使用して、すべてをUnicodeで保持で​​きます。

7
Steve Townsend
wstring ws( args.OptionArg() );
string test( ws.begin(), ws.end() );
45
Ulterior

次の関数を使用して、ワイド文字列をASCII文字列に変換できます。

#include <locale>
#include <sstream>
#include <string>

std::string ToNarrow( const wchar_t *s, char dfault = '?', 
                      const std::locale& loc = std::locale() )
{
  std::ostringstream stm;

  while( *s != L'\0' ) {
    stm << std::use_facet< std::ctype<wchar_t> >( loc ).narrow( *s++, dfault );
  }
  return stm.str();
}

これは、同等のASCII文字がdfaultパラメーターに存在しないワイド文字を置き換えるだけで、UTF-16からUTFに変換しないことに注意してください。 -8。UTF-8に変換する場合は、 [〜#〜] icu [〜#〜] などのライブラリを使用します。

8
Praetorian

これは古い質問ですが、実際に変換を求めているのではなく、MircosoftのTCHARを使用してASCIIとUnicodeの両方をビルドできる場合は、stdを思い出すことができます::文字列は本当に

typedef std::basic_string<char> string

したがって、独自のtypedefを定義できます。

#include <string>
namespace magic {
typedef std::basic_string<TCHAR> string;
}

次に、magic::stringTCHARLPCTSTRなどとともに使用できます。

5
paulluap

次のコードはより簡潔です。

wchar_t wstr[500];
char string[500];
sprintf(string,"%ls",wstr);
2
Pamela Hauff

ただ楽しみのために:-):

const wchar_t* val = L"hello mfc";
std::string test((LPCTSTR)CString(val));
2
Serov Danil