RT。
CString str;
str=m_list.GetItemText(0,0);
file.Write(str, 2*str.GetLength());字符集unicode
list表中某一列为汉字,我这样写进去文件汉字变乱码,请问可以怎么解决。不换字符集。,谢谢
CString str;
str=m_list.GetItemText(0,0);
file.Write(str, 2*str.GetLength());字符集unicode
list表中某一列为汉字,我这样写进去文件汉字变乱码,请问可以怎么解决。不换字符集。,谢谢
char szHeader[] = {0xFF, 0xFE};
file.Write(szHeader, 2);
CString str;
str=m_list.GetItemText(0,0);
file.Write(str, 2*str.GetLength());
...
你可以试着用那个程序写入“测试文本”进一个文件。再用记事本,保存时选择编码是Unicode,写同样的文本。然后用WinHex打开看看有什么不同。可以贴出来一起讨论。
char szHeader[] = {0xFF, 0xFE};
char Item_name[]="序列,类型,时间,水位,电压,报警";
file.Write(szHeader, 2);
file.Write(Item_name,sizeof(Item_name));
file.Write(_T("\r\n"),2);
for(int i=0;i<m_list.GetItemCount();i++)
{
str=m_list.GetItemText(i,0);
file.Write(str, 2*str.GetLength()); file.Write(_T(","),1);
str=m_list.GetItemText(i,1);
file.Write(str, 2*str.GetLength());
}
接上。我是那样写csv的。循环后面还有。可能这样看语法会错。如果我加入char szHeader[] = {0xFF, 0xFE};并写入的话。打开excel就变成这样
如果不加。就是这样
CString str = L"中国欢迎您!";
int len = WideCharToMultiByte(CP_ACP, 0, str, str.GetLength(), NULL, 0, NULL, NULL);
char* buf = new char[len+1];
WideCharToMultiByte(CP_ACP, 0, str, str.GetLength(), buf, len, NULL, NULL);
buf[len+1] = '\0';
file.Write(buf, str.GetLength()*2);
file.Flush();
多谢你的代码。我把 str=m_list.GetItemText(i,0);获取到的变量按照你说的转换了再放进去就可以了。
只是还有一个疑问。就是你上面的str最后是个!,加进去就会出现错误。像这样
后面的挤到前面来了,因为是保存为csv的,所以我写完数据后都这样file.Write(_T(","),1);写个逗号进去分列。如果我把那个!去掉就不会又问题。请问这个是怎么回事?如果我要加!的话怎么做才不会出现这样的错误?
file.Write((LPCWSTR)str, 2*str.GetLength());
再改成这样试试
写文件之前调用这个
setlocale( LC_CTYPE, "chs" );
写完文件后调用这个
free( old_locale );
stra = str;
就自动转换成ANSI了。不过因为楼主说了不换字符集,所以我理解应该直接写Unicode。
不过后来查了一下,发现Windows版本的Excel对于UTF-16编码的CSV文件支持不好,无论带不带BOM。不过UTF-8带BOM的识别倒是不错。
将CFile改成CStdioFile就可以搞定
if (file.GetLength() == 0ULL) {
BYTE szHeader[] = { 0xFF, 0xFE };
file.Write(szHeader, sizeof(szHeader));
}
#endif
CString str = m_list.GetItemText(0,0);
file.Write((LPCVOID)(LPCTSTR)str, sizeof(TCHAR) * str.GetLength());