Convert const char* to const wchar_t*

后端 未结 3 1301
有刺的猬
有刺的猬 2021-02-09 08:30

I am trying to create a program with Irrlicht that loads certain things from a configuration file written in Lua, one of which is the window title. However, the lua_tostri

相关标签:
3条回答
  • 2021-02-09 09:03

    For 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;
    

    This is working using mbstowcs_s.

    0 讨论(0)
  • 2021-02-09 09:06

    You can use mbstowcs:

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

    or more safe:

        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];
    
    0 讨论(0)
  • 2021-02-09 09:19

    There are multiple questions on SO that address the problem on Windows. Sample posts:

    1. char* to const wchar_t * conversion
    2. conversion from unsigned char* to const wchar_t*

    There is a platform agnostic method posted at http://ubuntuforums.org/showthread.php?t=1579640. The source from this site is (I hope I am not violating any copyright):

    #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 ;
    
        // Incorrect code from the link
        // const ctype<char>& ctfacet = use_facet<ctype<char>>(stm.getloc());
    
        // Correct code.
        const ctype<wchar_t>& ctfacet = use_facet<ctype<wchar_t>>(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' ;
      } 
    }
    
    0 讨论(0)
提交回复
热议问题