求教如何解决因字符集不同产生的乱码问题?

时间:2022-09-22 22:42:26
求教如何解决因字符集不同产生的乱码问题?

求教如何解决因字符集不同产生的乱码问题?


void CServerSocket::OnReceive(int nErrorCode)
{
// TODO:  在此添加专用代码和/或调用基类

CAsyncSocket::OnReceive(nErrorCode);

char szTemp[30];

int n = Receive(szTemp , 30 );
szTemp[n] = '\0';

CString sTemp ;

sTemp.Format( _T("收到:%s") , szTemp);
((CChatServerDlg*)(AfxGetApp()->m_pMainWnd))->m_ListWords.AddString( sTemp );
((CChatServerDlg*)(AfxGetApp()->m_pMainWnd))->m_ListWords.SetTopIndex(
((CChatServerDlg*)(AfxGetApp()->m_pMainWnd))->m_ListWords.GetCount()-1 );

}

6 个解决方案

#1


查过相关资料,例如使用A2T什么的,但是都无法解决问题。

#2


自顶一个。求不沉。。

#3


Client与server工程都用同一种字符集编译。多字节或unicode

#4


如果是字符集问题导致乱码,一个字都不会对,既然前几个字对了,那就是发送或者接收数据不全
试了一下果然如此,“解决方찀쳌理”,中间那两个符号是0x00 0xcc 0xcc 0xcc,就是说只收到了六个字节,第七个字节被赋了0但unicode每个字符是两字节,第八个字节依然是栈中VS调试模式下自动填充的0xcc,结果就这样了

#5


问题解决了,问题出在发送端。。

m_ClientSocket.Send(m_sWords, m_sWords.GetLength());

// m_sWords是要发送的数据,测试数据为“程序设计”

客户端的send发送以后,返回值为发送数据的总数,就是4.

数据正常发送

但是接收代码

int n = Receive(szTemp , 30 );

得到n=4。

szTemp的数据就成了{   程(第0 1个字符)     序 (第 2  3个字符 )  \0(第4个字符 )  ......  }

这时候要发送的数据只能显示一半。。

所以改正的方法就是:

m_ClientSocket.Send(m_sWords,   2 *   m_sWords.GetLength());

让发送是数据长度为2倍。

这时接收代码的 n=8.

0-7的缓存区就可以把“程序设计”四个字符完全显示出来了。。

#6


不过这样单纯的用 2* 很不好。。

应该把unicode转化为WCHAR,然后再乘以sizeof(WCHAR)会比较可靠,

安全做法应该是把
LPCTSTR pText=(LPCTSTR)m_sWords;

m_ClientSocket.Send(pText, sizeof(TCHAR) * m_sWords.GetLength()); 

------上文出自百度贴吧   @啊感叹号祖国    
另感谢@沧海_月时代   给予的指点

#1


查过相关资料,例如使用A2T什么的,但是都无法解决问题。

#2


自顶一个。求不沉。。

#3


Client与server工程都用同一种字符集编译。多字节或unicode

#4


如果是字符集问题导致乱码,一个字都不会对,既然前几个字对了,那就是发送或者接收数据不全
试了一下果然如此,“解决方찀쳌理”,中间那两个符号是0x00 0xcc 0xcc 0xcc,就是说只收到了六个字节,第七个字节被赋了0但unicode每个字符是两字节,第八个字节依然是栈中VS调试模式下自动填充的0xcc,结果就这样了

#5


问题解决了,问题出在发送端。。

m_ClientSocket.Send(m_sWords, m_sWords.GetLength());

// m_sWords是要发送的数据,测试数据为“程序设计”

客户端的send发送以后,返回值为发送数据的总数,就是4.

数据正常发送

但是接收代码

int n = Receive(szTemp , 30 );

得到n=4。

szTemp的数据就成了{   程(第0 1个字符)     序 (第 2  3个字符 )  \0(第4个字符 )  ......  }

这时候要发送的数据只能显示一半。。

所以改正的方法就是:

m_ClientSocket.Send(m_sWords,   2 *   m_sWords.GetLength());

让发送是数据长度为2倍。

这时接收代码的 n=8.

0-7的缓存区就可以把“程序设计”四个字符完全显示出来了。。

#6


不过这样单纯的用 2* 很不好。。

应该把unicode转化为WCHAR,然后再乘以sizeof(WCHAR)会比较可靠,

安全做法应该是把
LPCTSTR pText=(LPCTSTR)m_sWords;

m_ClientSocket.Send(pText, sizeof(TCHAR) * m_sWords.GetLength()); 

------上文出自百度贴吧   @啊感叹号祖国    
另感谢@沧海_月时代   给予的指点