我正在尝试使用Irrlicht创建一个程序,该程序从用Lua编写的配置文件加载某些内容,其中一个是窗口标题。但是,lua_tostring
函数返回const char*
而Irrlicht设备的方法setWindowCaption
预计const wchar_t*
。我如何转换lua_tostring
返回的字符串?将const char *转换为常量wchar_t *
5
A
回答
3
在SO上有多个问题可以解决Windows上的问题。样品的帖子:
有张贴在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' ;
}
}
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];
相关问题
- 1. 转const const wchar_t *为const char *
- 2. 如何将'wchar_t *'转换为'const char *'
- 3. 如何为wchar_t *转换为const char *
- 4. 无法将'LPCWSTR {aka const wchar_t *}'转换为'LPCSTR {aka const char *}
- 5. 无法将'const char *'转换为'LPCWSTR {aka const wchar_t *}'
- 6. 无法将参数1从'const char *'转换为'const wchar_t *'
- 7. 将wchar_t转换为char C++
- 8. “默认参数”:无法从“为const char [1]”转换为“常量为wchar_t *”
- 9. 不能将'const char *'转换为'char * const *'
- 10. 转换为wchar_t为CHAR
- 11. 将NSString转换为const char
- 12. 将NSString转换为const char *
- 13. 将const char *转换为int
- 14. 将UIImage转换为const char *?
- 15. 将int转换为常量wchar_t *
- 16. 将常量wchar_t *转换为WCHAR *
- 17. Const char * vs const wchar_t *(concatenation)
- 18. 将const const wchar_t *转换为python字符串在boost python
- 19. 如何将wchar_t **转换为char **?
- 20. 如何将PCWSTR转换为char []或wchar_t []
- 21. 不能将Const Char [21]转换为Char?
- 22. 在C++中将char *转换为const char *
- 23. C++将char转换为const char *
- 24. 将const char *转换为char *的问题
- 25. 如何将const char * const转换为const char *
- 26. 无法将参数1从'ATL :: CStringT <wchar_t,ATL :: StrTraitATL <wchar_t,ATL :: ChTraitsCRT <wchar_t> >>'转换为'const char *'
- 27. 如何为const WCHAR *转换为const char *
- 28. 如何为const char *转换为const WCHAR *
- 29. 从签名为const char *类型转换为字符常量*
- 30. C++加载错误:无法将const值类型*(又名常量wchar_t *)转换为常量字符*初始化
忘了澄清我在Ubuntu上。现在测试您的答案... – Giaphage47
通常,我发现在Ubuntu中处理C++中的宽文本需要设置默认语言环境。实现的行为非常具有讽刺意味。使用UTF-8和Unix-land一样,区域设置对于窄范围转换并不重要,但必须进行设置,而对于各种单字节编码,例如在Windows中,区域设置非常重要,但默认情况下已设置。 –