Sto provando a creare un programma con Irrlicht che carica alcune cose da un file di configurazione scritto in Lua, uno dei quali è il titolo della finestra. Tuttavia, la funzione lua_tostring
restituisce un valore const char*
mentre il metodo del dispositivo Irrlicht setWindowCaption
prevede uno const wchar_t*
. Come posso convertire la stringa restituita da lua_tostring
?Converti const char * in const wchar_t *
5
A
risposta
3
Ci sono più domande su SO che risolvono il problema su Windows. Messaggi di esempio:
c'è un metodo agnostica piattaforma pubblicato su http://ubuntuforums.org/showthread.php?t=1579640. La fonte da questo sito è (spero non sto violando i diritti d'autore):
#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
È possibile utilizzare mbstowcs:
wchar_t WBuf[100];
mbstowcs(WBuf,lua_tostring(/*...*/),99);
o più sicura:
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];
Problemi correlati
- 1. Converti int in const wchar_t *
- 2. Come convertire 'wchar_t *' in 'const char *'
- 3. Converti CString in const char *
- 4. Converti const char ** in void *?
- 5. Come convertire wchar_t * a const char *
- 6. const char * myVar vs. const char myVar []
- 7. non può convertire 'LPCWSTR {aka const wchar_t *}' in 'LPCSTR {aka const char *}
- 8. come convertire const WCHAR * a const char *
- 9. const char * inizializzazione
- 10. printf% s const char *
- 11. Converti stringa in tipo const char * utilizzando Arduino
- 12. const char * concatenazione
- 13. C++ converte char in const char *
- 14. C: Assegnazione di "static const char * const" a "static const char *"
- 15. Come trasformare 'const boost :: filesystem2 :: path' in 'const char *'?
- 16. Converti char * a * wchar_t utilizzando mbstowcs_s
- 17. C++: char ** a const char ** conversione
- 18. const constexpr char * vs. constexpr char *
- 19. Funzione C++ restituendo const char *
- 20. extern const char * const SOME_CONSTANT mi dà errori del linker
- 21. La conversione da const char * a const std :: string &
- 22. Quale usare const char [] o const std :: string?
- 23. L'int main (int, char const * const *) è ben formato?
- 24. Come creare una matrice const statico const char *
- 25. Come convertire std :: string in const char *?
- 26. Come si converte LPCWSTR in const char *?
- 27. Come importare const char * API in C#?
- 28. Forza `const char []` letterali stringa in clang
- 29. metodi const e no const in C++?
- 30. Come memorizzare un const char * in un char *?
dimenticato di chiarire che Sono su ubuntu. Prova la tua risposta ora ... – Giaphage47
In generale, ho scoperto che occuparsi di un testo esteso in C++ in Ubuntu richiede l'impostazione delle impostazioni internazionali predefinite. È molto ironico come si comportano le implementazioni. Con UTF-8 come in Unix-land, le impostazioni locali non sono importanti per la conversione narrow-wide, ma devono essere impostate, mentre con le varie codifiche a byte singolo come in Windows le impostazioni locali sono molto importanti, ma sono già impostate per impostazione predefinita. –