关于宽字符的一个古怪的问题......
最近一直在玩Lua,前几天注意到Luaplus提供了宽字符的支持,就用了一下,结果遇上一个古怪的问题,我不太清楚究竟是VS的问题,还是Luaplus的问题。所以发上来大家讨论下
首先是C++代码,很简单
void Say(const TCHAR* szText)
{
std::wcout < < szText < < std::endl;
}
我将这个函数注册给lua,然后在脚本中调用,lua脚本是这样的
function Run()
text = L "你好,世界! "
Say(text)
end
我执行一遍,一切正常,控制台窗口中正常显示出了“你好,世界!”,这个时候我想着把它转成普通的char*,问题就出来了,代码是这样
void Say(const TCHAR* szText)
{
std::wcout < < szText < < std::endl;
char szBuff[512] = {0};
WideCharToMultiByte(CP_ACP,NULL,szText,_tcslen(szText),szBuff,512,NULL,FALSE);
std::cout < < szBuff < < std::endl;
}
结果输出居然是乱码... 显示成了 "??o?,êà??! "
这时我发现最开始的宽字符串szText在VS的监视窗口中显示也是乱码?这让我大惑不解,如果是这个字符串传进来就错掉了,为什么std::wcout还能正常输出呢?
[解决办法]
不是代码问题,其结症在于所定制的操作系统.如果我们定制的操作系统默认语言不是中文,也会出现这种情况.由于标准的SDK默认语言为英文,所以肯定会出现这个问题.而这个问题的解决,不能在简单地更改控制面板的 "区域选项 "的 "默认语言 ",而是要在系统定制的时候,选择默认语言为 "中文 ".
系统定制时选择默认语言的位置于:
Platform -> Setting... -> locale -> default language ,选择 "中文 ",然后编译即可.
[解决办法]
需要字符集才能显示字符的
我们的系统默认是用的GB2312, 如果你的不是的话, 显示出来的应该就是乱码
[解决办法]
hello world 不是你好世界的意思, 是大家好.
[解决办法]
?
[解决办法]
mark,学习
[解决办法]
mark
[解决办法]
把 CP_ACP 替换成936试试。
[解决办法]
对于神秘的wcout,好象跟具体的STL库实现有关.先不管它.
IDE环境的DEBUG监视窗口也不要管它.
在控制台窗口标题栏,右键菜单 '属性 '里查看这个控制台使用的代码页.
[解决办法]
你定义了UNICODE了么?
如果没有定义UNICODE, szText就不是widechar了,转换当然有问题...........
TCHAR不代表就是widechar............