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 *
5
A
Odpowiedz
3
Jest wiele pytań na SO, które rozwiązują problem w systemie Windows. Przykładowe posty:
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' ;
}
}
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
- 1. Konwertuj int na const wchar_t *
- 2. Jak przekonwertować wchar_t * na const char *
- 3. C: Przypisywanie "static const char * const" do "const static char *"
- 4. jak konwertować const WCHAR * na const char *
- 5. Jak utworzyć statyczną tablicę const const char *
- 6. Konwersja NSString na const char
- 7. Niejawna konwersja z char ** na const char **
- 8. Jak rozpoznać typ const char * i const char [] w kodzie?
- 9. Double to Const Char *
- 10. Konwertuj const char * na NSString * i przekonwertuj - _NSAutoreleaseNoPool()
- 11. const char pointer przypisania
- 12. const constexpr char * vs. constexpr char *
- 13. dla const odniesienia do const wskaźnik wskazujący na const obiektu
- 14. const unsigned char * na std :: string
- 15. Jak przekonwertować std :: string na const char *?
- 16. Jak przekonwertować LPCWSTR na const char *?
- 17. Czy int main (int, char const * const *) jest dobrze uformowany?
- 18. const char * na wektor <unsigned char> Inicjalizacja
- 19. Czysty sposób przekonwertować QString na char * (nie const char * !!!!)
- 20. funkcja przeciążenia: const * vs const &
- 21. const vs new const
- 22. Jak skopiować zawartość zmiennej const char * type?
- 23. Obsada „wskaźnik do const” na „wskaźnik do const VLA”
- 24. C++ wskaźnik do tablicy const const wskaźniki
- 25. Python to C/C++ const char question
- 26. C++ 11 rodzaj odliczenie vs const char *
- 27. sizeof dla zakończonej znakiem zero const char *
- 28. Delphi PChar do C++ const char *
- 29. Modyfikacja przez const const wskaźnik
- 30. Const char tablica o rozmiarze szablon argumentu vs. wskaźnik char
Zapomniałeś wyjaśnić, że Jestem na ubuntu. Testowanie odpowiedzi teraz ... – Giaphage47
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. –