将const char *转换为const wchar_t *

时间:2015-05-23 05:49:07

标签: c++ type-conversion

我正在尝试使用Irrlicht创建一个程序,该程序从Lua编写的配置文件加载某些内容,其中一个是窗口标题。但是,lua_tostring函数返回const char*,而Irrlicht设备的方法setWindowCaption需要const wchar_t*。如何转换lua_tostring返回的字符串?

3 个答案:

答案 0 :(得分:5)

在SO上有多个问题可以解决Windows上的问题。样本帖子:

  1. char* to const wchar_t * conversion
  2. conversion from unsigned char* to const wchar_t*
  3. http://ubuntuforums.org/showthread.php?t=1579640发布了一个平台无关的方法。本网站的来源是(我希望我没有侵犯任何版权):

    #include <locale>
    #include <iostream>
    #include <string>
    #include <sstream>
    using namespace std ;
    
    wstring widen( const string& str )
    {
        wostringstream wstm ;
        const ctype<wchar_t>& ctfacet = 
                            use_facet< ctype<wchar_t> >( wstm.getloc() ) ;
        for( size_t i=0 ; i<str.size() ; ++i ) 
                  wstm << ctfacet.widen( str[i] ) ;
        return wstm.str() ;
    }
    
    string narrow( const wstring& str )
    {
        ostringstream stm ;
        const ctype<char>& ctfacet = 
                             use_facet< ctype<char> >( stm.getloc() ) ;
        for( size_t i=0 ; i<str.size() ; ++i ) 
                      stm << ctfacet.narrow( str[i], 0 ) ;
        return stm.str() ;
    }
    
    int main()
    {
      {
        const char* cstr = "abcdefghijkl" ;
        const wchar_t* wcstr = widen(cstr).c_str() ;
        wcout << wcstr << L'\n' ;
      }
      {  
        const wchar_t* wcstr = L"mnopqrstuvwx" ;
        const char* cstr = narrow(wcstr).c_str() ;
        cout << cstr << '\n' ;
      } 
    }
    

答案 1 :(得分:2)

您可以使用mbstowcs

    wchar_t WBuf[100];
    mbstowcs(WBuf,lua_tostring( /*...*/ ),99);

或更安全:

    const char* sz = lua_tostring(/*...*/);
    std::vector<wchar_t> vec;
    size_t len = strlen(sz);
    vec.resize(len+1);
    mbstowcs(&vec[0],sz,len);
    const wchar_t* wsz = &vec[0];

答案 2 :(得分:0)

对于Unicode:

std::string myString = "Master James";
const char* sz = myString.c_str();
size_t origsizes = strlen(sz) + 1;
const size_t newsizes = 500;
size_t convertedCharP = 0;
wchar_t constTowchar[500];
mbstowcs_s(&convertedCharP, constTowchar, origsizes, sz, _TRUNCATE);
std::wcout << constTowchar << std::endl;

这正在使用mbstowcs_s