用VC做的一个win32程序,用unicode字符的.
用recv()函数接收数据的时候,该函数的参数只能用char类型的,所以要进行转换.char chaRec[50];
recv(sockAcc,chaRec,50,0);
MessageBox(NULL,chaRec,_T("INFO"),MB_OK);wchar_t chaRec[50];
recv(sockAcc,(char*)chaRec,50,0);
MessageBox(NULL,chaRec,_T("INFO"),MB_OK);这两个强制转换,显示的都是乱码.试过multibyteTowidechar()函数也只能传送英文,中文还是乱码.请问怎么解决?
请不要贴ctrl+c的废话,也不要告诉我用_T()宏,关键在这两种数据类型,一个8位,一个16位.

解决方案 »

  1.   

    本帖最后由 wenxy1 于 2008-12-25 09:11:41 编辑
      

  2.   

    一定要养成一个好习惯,要把buffer清0.
    char chaRec[100]; 
    memset(chaRec, 0, sizeof(chaRec));或者memset(chaRec, '\0', sizeof(chaRec));
      

  3.   

    网络传输与数据类型无关,如果2端都是unicode的话,强转一下肯定没问题,就怕一端unicode一端ansi
      

  4.   

    两端都是ascii或两端都是unicode应该可以强制转换。
    如果两端编码不同,强制转换就会出现乱码。
    楼主的程序估计发送方使用了char,而接收方使用的wchar_t。
    这种情况可以使用ATL中的CA2CT类或A2T宏来转换。
    CA2CT类在UNICODE下被转换为CA2W,实现char到wchar_t的转换;
    在非UNICODE下直接原样返回。CA2CT类为ATL7.0新增类,A2T宏为旧版ATL3.0宏,功能一样,建议使用新类。用法:#include<AtlBase.h>
    #include<AtlConv.h>// ......
    CA2T lpszBuffer((LPCSTR)chaRec);  // lpszBuffer指向转换好的buffer,可以直接当LPCTSTR指针使用
    如果用宏:#include<AtlBase.h>
    #include<AtlConv.h>// ......
    USES_CONVERSION;  // 必须先使用此宏
    LPTSTR lpszBuffer = A2T((LPSTR)chaRec);
      

  5.   

    对于SOCKET来说,他根本不关心你发送的是UNICODE还是ANSI,关键是发送和接受的两端知道他是个什么就可以了,强制类型转换是肯定可以的.
      

  6.   

    说个UNICODE和ANSI版本都可以用的方法:
    TCHAR sztRec[50] = {0};
    char szRec[100] = {0};
    int nRet = recv(socket, szRec, 100, 0);
    memcpy(sztRec, szRec, nRet*sizeof(TCHAR));
      

  7.   

    最好是用UTF-8的格式进行发送,