我想将普通的string转换为wstring。为此,我尝试使用Windows API函数 MultiByteToWideChar
但这对我不起作用。

这是我所做的:

string x = "This is c++ not java";
wstring Wstring;
MultiByteToWideChar( CP_UTF8 , 0 , x.c_str() , x.size() , &Wstring , 0 );

最后一行产生编译器错误:

'MultiByteToWideChar' : cannot convert parameter 5 from 'std::wstring *' to 'LPWSTR'

如何解决此错误?

另外,参数cchWideChar的值应该是什么? 0还可以吗?

最佳答案

您必须两次调用MultiByteToWideChar:

  • 第一次调用MultiByteToWideChar用于查找宽字符串所需的缓冲区大小。看Microsoft's documentation;它指出:



    因此,要使MultiByteToWideChar提供所需的大小,请传递0作为最后一个参数cchWideChar的值。您还应该传递NULL作为它之前的lpWideCharStr
  • 使用上一步中的缓冲区大小,获取一个足以容纳宽字符串的非常量缓冲区。将此缓冲区传递给另一个对MultiByteToWideChar的调用。这次,最后一个参数应该是缓冲区的实际大小,而不是0。

  • 一个粗略的例子:
    int wchars_num = MultiByteToWideChar( CP_UTF8 , 0 , x.c_str() , -1, NULL , 0 );
    wchar_t* wstr = new wchar_t[wchars_num];
    MultiByteToWideChar( CP_UTF8 , 0 , x.c_str() , -1, wstr , wchars_num );
    // do whatever with wstr
    delete[] wstr;
    

    另外,请注意使用-1作为cbMultiByte参数。这将使结果字符串以null终止,从而使您无需处理它们。

    07-28 04:49