2015-05-23 18 views
5

Próbuję utworzyć program z Irrlicht, który ładuje pewne rzeczy z pliku konfiguracyjnego zapisanego w Lua, z których jednym jest tytuł okna. Jednak funkcja lua_tostring zwraca wartość const char*, podczas gdy metoda urządzenia Irrlicht oczekuje od użytkownika setWindowCaption oczekiwania na . Jak mogę przekonwertować ciąg zwracany przez lua_tostring?Konwertuj const char * na const wchar_t *

Odpowiedz

3

Jest wiele pytań na SO, które rozwiązują problem w systemie Windows. Przykładowe posty:

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

Jest to platforma agnostykiem sposób pisał w http://ubuntuforums.org/showthread.php?t=1579640. Źródło z tej strony (mam nadzieję, że ja nie naruszono praw autorskich):

#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' ; 
    } 
} 
+0

Zapomniałeś wyjaśnić, że Jestem na ubuntu. Testowanie odpowiedzi teraz ... – Giaphage47

+0

Ogólnie stwierdziłem, że radzenie sobie z szerokim tekstem w C++ w systemie Ubuntu wymaga ustawienia domyślnego ustawienia narodowego. To bardzo ironiczne, jak zachowują się implementacje. Z UTF-8, podobnie jak w Uniksie, ustawienia lokalne nie mają większego znaczenia dla wąsko-szerokiej konwersji, ale muszą być ustawione, podczas gdy z różnymi kodami jednobajtowymi, takimi jak w systemie Windows, ustawienia lokalne są bardzo ważne, ale są już ustawione domyślnie. –

2

Można użyć mbstowcs:

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

lub bardziej bezpieczne:

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]; 
Powiązane problemy