如果编译选项确实是unicode,那么
pBuff使用TextOutA函数输出看看,应该不会乱码

解决方案 »

  1.   


    谢谢回复,我是用网络传输。 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;
    }
    英文字符是可以的,汉字就显示问号.
      

  2.   

    使用WideCharToMultiByte转换一下即可:void CopyCStringTToChar( char* pchDest, const CString& strSrc, int nDestLen )
    {
    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
    }
      

  3.   

    你的逻辑有问题。
    网络传输char *并不是要求你把文字也转换为ANSI编码。网络传输的实际是字节流。
    所以你把CString的内容直接拷贝到一个char数组里,或者强制转换也可以。
    if( ::send( s, (const char *) (LPCTSTR) str, (str.GetLength() + 1) * sizeof(TCHAR) , 0 ) != SOCKET_ERROR )
    加不加一取决于你是不是用其它的结构传递了字符串长度,如果那样,就可以省略掉。
      

  4.   

    char *和ANSI编码字符串没有必然联系。网络通信接口里char *只是指向一个数组罢了。
      

  5.   


    size_t len = str.GetLength()*sizeof(TCHAR);
    if( ::send( s, pBuff, len, 0 ) != SOCKET_ERROR )
      

  6.   


    用如下的代码只能传过去第一个字符,汉字是一个乱码。 if( ::send( s, (const char *)((LPCTSTR)str), (str.GetLength() + 1) * sizeof(TCHAR), 0 ) != SOCKET_ERROR )
      

  7.   

    CString str, str1;
    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;
    }
      

  8.   

    转换代码页用 936 
    WideCharToMultiByte( 936, ……
      

  9.   

    对电脑而言没有乱码,只有二进制字节;对人脑才有乱码。啊 GBK:0xB0 0xA1,Unicode-16 LE:0x4A 0x55,Unicode-16 BE:0x55 0x4A,UTF-8:0xE5 0x95 0x8Avoid HexDump(char *buf,int len,int addr) {
        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);
        }
    }
      

  10.   


    用如下的代码只能传过去第一个字符,汉字是一个乱码。 if( ::send( s, (const char *)((LPCTSTR)str), (str.GetLength() + 1) * sizeof(TCHAR), 0 ) != SOCKET_ERROR )
    你服务器接收的时候不要再用A2W转码啊。保持编码,你的转换是多此一举。