读书人

Winsocket recv 乱码有关问题

发布时间: 2012-03-28 15:40:03 作者: rapoo

Winsocket recv 乱码问题
小弟闲来无事 将以前用C#写的一段httpreqest 代码改成C++的,历经千辛万苦终于可以执行了。可以在访问某些中文网站时, 获取的字符流里面有乱码。
先贴代码:

C/C++ code
#include "stdafx.h"  #include <stdio.h>  #include <stdlib.h>  #include <string>  #include <winsock2.h>  #pragma comment(lib, "WS2_32")   #include <iostream>void SendString(SOCKET sock, LPCSTR str){    send(sock,str,strlen(str),0);}bool HttpClient() {     WSADATA ws;     SOCKET s;     struct sockaddr_in addr;     struct hostent *pHostent;    int iResult;     long lResult;     char strSubAddr[100], strBuffer[100];     lResult = WSAStartup(0x0101,&ws);     s = socket(AF_INET,SOCK_STREAM,0);         char ina[]="www.tianya.cn";    //下面将网址转换成IP地址:    pHostent = gethostbyname(ina);    addr.sin_family = AF_INET;     addr.sin_port = htons(80);     addr.sin_addr.s_addr = *(unsigned long *)pHostent->h_addr_list[0];    iResult=connect(s,(struct sockaddr *) &addr, sizeof(addr));     if(SOCKET_ERROR == iResult)     {         // 连接失败         WSACleanup();         return FALSE;     }     else {                  //这里是要发送的http头部                 SendString(s, "GET / HTTP/1.1\r\n");            SendString(s, "Host: www.tianya.cn/publicforum/articleslist/0/feeling.shtml\r\n");            SendString(s, "Accept: */*\r\n");            SendString(s, "Content-Type: application/x-www-form-urlencoded");            //SendString(s, "User-Agent: Mozilla/4.0");            //SendString(s, "(compatible; MSIE 7.00; Windows 98)\r\n");            //SendString(s, "Connection:Keep-Alive\r\n");            SendString(s, "\r\n");            SendString(s, "\r\n");//最后要加空行                    iResult = 1;         // 获取返回字符流         while( iResult >0 )         {             strset(strBuffer,' ');                            //这里的strBuffer老是有乱码 我试过百度也有乱码            iResult = recv(s,strBuffer,100,0);             std::cout<<strBuffer;        }             }     delete strBuffer;    closesocket(s);    WSACleanup();     return TRUE; } void main(){    HttpClient();    std::cout<<"";}


网上查了很多 没有一个具体的解决方案。 不知道怎么将recv的字符流解码。 求救中!!!!

[解决办法]
strset(strBuffer,' ');
字符串是这么初始化的?

iResult = recv(s,strBuffer,100,0);
字符串结束符在哪里?
[解决办法]
memset初始化字符串吧

如果还是乱码,应该是编码格式的问题
[解决办法]
楼主,对于你的乱码问题
很大一部分在于初始化

对于数组,char a[n]; 用memset(a, 0, sizeof(a))初始化
对于指针,char *a = new char[n], 用memset(a, 0, n)初始化
[解决办法]
编码问题
[解决办法]
探讨

编码问题

[解决办法]
探讨
楼主,对于你的乱码问题
很大一部分在于初始化

对于数组,char a[n]; 用memset(a, 0, sizeof(a))初始化
对于指针,char *a = new char[n], 用memset(a, 0, n)初始化

[解决办法]
还有个问题就是看看是不是支持UniCode,如果只支持英文的代码,遇到了中文网站,就用乱码

char - > wchar_t
[解决办法]
C/C++ code
            iResult = recv(s,strBuffer,100000,0);            MultiByteToWideChar( CP_UTF8, 0, strBuffer, (int) strlen(strBuffer)+1, wscBuffer, sizeof(wscBuffer)/sizeof(wchar_t) );            WideCharToMultiByte( CP_ACP, 0, wscBuffer, -1,strBuffer, 100000, NULL, NULL );            std::cout<<strBuffer; 


[解决办法]
没有直接utf-8 =》ansi
用unicode做中转 utf-8 => unicode =>ansi
[解决办法]
又是UTF8...伤不起啊...

读书人网 >C++

热点推荐