如果编译选项确实是unicode,那么
pBuff使用TextOutA函数输出看看,应该不会乱码
pBuff使用TextOutA函数输出看看,应该不会乱码
解决方案 »
- excel插件程序中调用控件方法
- 【急!可有高手知道】如何用VC捕捉IE中silverlight控件的鼠标事件?
- 窗口最小化后,如何响应按键消息
- IE8的margin
- [c++初学者]大家帮看看,为什么我做的DLL就无法访问里面的函数呢?[附源码]
- LoadIcon(filename)出错
- 提个小问题。我最近开始使用VC.net。发现如果用了.net框架做的Winform程序的话。就不能用以前C++的一些东西了。
- 哪位大侠能告诉我在MFC中怎么才能打开完整的Word文件?
- 如何用CFile类保存float或double类型的数据?
- 请教,我在用事件触发线程时,发现经常性的丢失事件,也就是说线程对事件不响应,请教,具体如下:谢谢
- 数据结构中单链表的定义用C语言表述,不是很明白
- 如何使用钩子获取鼠标点击的按钮名称?
谢谢回复,我是用网络传输。 size_t len = str.GetLength();
if( ::send( s, pBuff, len, 0 ) != SOCKET_ERROR )
然后在服务器端这样接收:
LRESULT CTCPClientDlg::OnSocket(WPARAM wParam, LPARAM lParam)
{
USES_CONVERSION;
// TODO: Add your control notification handler code here
char cs[100] = {0};
if( lParam == FD_READ )
{
CString num = TEXT("");
recv( s, cs, 100, NULL );
CString recvText = A2W(cs);
GetDlgItem( IDC_TEXT ) -> GetWindowText( num );
num += TEXT("服务器说:\r\n");
num += recvText;
GetDlgItem( IDC_TEXT ) -> SetWindowText( num );
} return 0;
}
英文字符是可以的,汉字就显示问号.
{
if ( pchDest == NULL )
{
return;
}#ifdef _UNICODE // 使用宽字节
{
WCHAR* pWStrSRc = const_cast<CString&>(strSrc).GetBuffer(0);
int nTmplen = WideCharToMultiByte( CP_ACP, 0, pWStrSRc, -1, NULL, 0, NULL, NULL );
char* pTemp = new char[nTmplen+1];
memset( pTemp, 0, nTmplen+1 );
WideCharToMultiByte( CP_ACP, 0, pWStrSRc, -1, pTemp, nTmplen+1, NULL, NULL ); int nLen = strlen(pTemp);
if( nLen + 1 > nDestLen )
{
strncpy( pchDest, pTemp, nDestLen-1 );
pchDest[nDestLen-1] = 0;
}
else
{
strcpy( pchDest, pTemp );
} delete []pTemp;
}
#else // 使用窄字节
{
int nSrcLen = strSrc.GetLength(); if( nSrcLen + 1 > nDestLen )
{
strncpy( pchDest, strSrc, nDestLen-1 );
pchDest[nDestLen-1] = 0;
}
else
{
strcpy( pchDest, strSrc );
}
}
#endif
}
网络传输char *并不是要求你把文字也转换为ANSI编码。网络传输的实际是字节流。
所以你把CString的内容直接拷贝到一个char数组里,或者强制转换也可以。
if( ::send( s, (const char *) (LPCTSTR) str, (str.GetLength() + 1) * sizeof(TCHAR) , 0 ) != SOCKET_ERROR )
加不加一取决于你是不是用其它的结构传递了字符串长度,如果那样,就可以省略掉。
size_t len = str.GetLength()*sizeof(TCHAR);
if( ::send( s, pBuff, len, 0 ) != SOCKET_ERROR )
用如下的代码只能传过去第一个字符,汉字是一个乱码。 if( ::send( s, (const char *)((LPCTSTR)str), (str.GetLength() + 1) * sizeof(TCHAR), 0 ) != SOCKET_ERROR )
GetDlgItem( IDC_SENDTEXT ) -> GetWindowText(str);
//char* pBuff = W2A(str); //这个多余的不用转换
size_t len =( str.GetLength()+1)*sizeof(TCHAR);
if( ::send( s, pBuff, len, 0 ) != SOCKET_ERROR )LRESULT CTCPClientDlg::OnSocket(WPARAM wParam, LPARAM lParam)
{
USES_CONVERSION;
// TODO: Add your control notification handler code here
WCHAR cs[100] = {0};
if( lParam == FD_READ )
{
CString num = TEXT("");
recv( s, (char*)cs, 100, NULL );
//CString recvText = A2W(cs); 也不用转换
CString recvText = cs;
GetDlgItem( IDC_TEXT ) -> GetWindowText( num );
num += TEXT("服务器说:\r\n");
num += recvText;
GetDlgItem( IDC_TEXT ) -> SetWindowText( num );
} return 0;
}
WideCharToMultiByte( 936, ……
int i,j,k;
char binstr[80]; for (i=0;i<len;i++) {
if (0==(i%16)) {
sprintf(binstr,"%08x -",i+addr);
sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);
} else if (15==(i%16)) {
sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);
sprintf(binstr,"%s ",binstr);
for (j=i-15;j<=i;j++) {
sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');
}
printf("%s\n",binstr);
} else {
sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);
}
}
if (0!=(i%16)) {
k=16-(i%16);
for (j=0;j<k;j++) {
sprintf(binstr,"%s ",binstr);
}
sprintf(binstr,"%s ",binstr);
k=16-k;
for (j=i-k;j<i;j++) {
sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');
}
printf("%s\n",binstr);
}
}
用如下的代码只能传过去第一个字符,汉字是一个乱码。 if( ::send( s, (const char *)((LPCTSTR)str), (str.GetLength() + 1) * sizeof(TCHAR), 0 ) != SOCKET_ERROR )
你服务器接收的时候不要再用A2W转码啊。保持编码,你的转换是多此一举。