Unicode字符串存入CString就变成乱码? 本帖最后由 VisualEleven 于 2011-02-24 08:43:39 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 Unicode字符串应该有两个'\0'结尾吧,你一个不够。 应该不是这个原因,data[wcslen(data)]='\0'实际就是(unsigned short) data[19]=0,应该没错但字符串的长度确实发生了变化,貌似结束符'\0'的位置不对多插入两个消息框看看:Ucode_Acode(data,databuffer,true);MessageBoxW(NULL,data,0,0);data[wcslen(data)]='\0';AfxMessageBox(s); 用 atl 的W2A 宏具体用发见msdn WCHAR *data=new WCHAR[]; 这个是什么玩意。..... char *databuffer=new char[];WCHAR *data=new WCHAR[];这两行没看懂!另外,你直接CString recData = databuffer;就完成转换了(当然,如果databuffer里面没有结束符的话,需要添加一个)。再者,为什么不贴Ucode_Acode的代码,从你已贴的代码看,只能是Ucode_Acode有问题了。再再者,你这行data[wcslen(data)]='\0';在干什么?wcslen函数就需要结束符,你如果能成功调用wcslen(并且返回值也正确),那说明已经有结束符了!如果你的data里面没有结束符,那么你上面那样赋结束符,当然是不行的,因为wcslen返回都是不确定的,非常有可能让你的程序断言或者崩溃(因为你还对data进行了写操作,可能会越界)。 WideCharToMultiByte();用这个将Unicode转多字节 将ANSI转换成Unicode时,如果不是用正确的函数进行转换,而是简单地用“=”进行赋值,当然会出错的。比如有两个ANSI字符“A”和“B”,收到后直接把它们赋值给一个Unicode的变量,程序就会把这个由“A”和“B”组成的字符串解释成单个Unicod字符。 那宏已经老了,用新的ATL转换类CW2A格式如下:CA2W=>MBCS 2 UNICODECW2A=>UNICODE 2 MBCSCT2A=>TCHAR格式 2 MBCS 唉。。老老实实用MultyBytesToWideChar和WidecharToMultyBytes吧。 CListCtrl重绘,但是老数据会被新数据覆盖(被一起重绘了) ODBC访问excel时删除行的问题 今天升星,散分 怎么在Word里面加入自己的菜单啊?急!!! 线程间的能信,WaitCommEvent()怎么用? 使用ADO 怎么用画笔填充图形的每一个区域? MFC中 显卡控制之类 我认为不大可能解决的一个问题 对一个对话框中的list框中获取字符串,对字符串进行筛选,把筛选出来的字符串输出在另一个对话框的list框中 DX,多边形分解三角形的算法,现已知多边形顶点(大于100),求顶点索引算法 C/S架构中如何判断有多少服务器
多插入两个消息框看看:
Ucode_Acode(data,databuffer,true);
MessageBoxW(NULL,data,0,0);
data[wcslen(data)]='\0';
AfxMessageBox(s);
W2A 宏
具体用发见msdn
WCHAR *data=new WCHAR[];
这两行没看懂!另外,你直接CString recData = databuffer;
就完成转换了(当然,如果databuffer里面没有结束符的话,需要添加一个)。再者,为什么不贴Ucode_Acode的代码,从你已贴的代码看,只能是Ucode_Acode有问题了。再再者,你这行data[wcslen(data)]='\0';在干什么?
wcslen函数就需要结束符,你如果能成功调用wcslen(并且返回值也正确),那说明已经有结束符了!
如果你的data里面没有结束符,那么你上面那样赋结束符,当然是不行的,因为wcslen返回都是不确定的,非常有可能让你的程序断言或者崩溃(因为你还对data进行了写操作,可能会越界)。
比如有两个ANSI字符“A”和“B”,收到后直接把它们赋值给一个Unicode的变量,程序就会把这个由“A”和“B”组成的字符串解释成单个Unicod字符。
格式如下:
CA2W=>MBCS 2 UNICODE
CW2A=>UNICODE 2 MBCS
CT2A=>TCHAR格式 2 MBCS