Winsocket recv 乱码问题

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

#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的字符流解码。 求救中!!!!
...全文
449 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
luciferisnotsatan 2011-06-03
  • 打赏
  • 举报
回复
没有直接utf-8 =》ansi
用unicode做中转 utf-8 => unicode =>ansi
luciferisnotsatan 2011-06-03
  • 打赏
  • 举报
回复
            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。
wscBuffer 是wchar_t数组。
两个buff我都开了10万,你可以自己改下。但不要把报文切断输出。
  • 打赏
  • 举报
回复
还有个问题就是看看是不是支持UniCode,如果只支持英文的代码,遇到了中文网站,就用乱码

char - > wchar_t
vssvss 2011-06-03
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 maoxing63570 的回复:]
引用 3 楼 namelij 的回复:
楼主,对于你的乱码问题
很大一部分在于初始化

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

++
对于乱码问题,通常要么是没有初始化,要么是编码问题,但是在这里是没有初始化,你可以这样做
char a……
[/Quote]
不是初始化的问题 应该是编码问题
vssvss 2011-06-03
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 luciferisnotsatan 的回复:]
编码问题
[/Quote]
我也觉得是编码问题 有什么解决的办法吗 我访问google没问题 中文网站肯定有问题
vssvss 2011-06-03
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 namelij 的回复:]
楼主,对于你的乱码问题
很大一部分在于初始化

对于数组,char a[n]; 用memset(a, 0, sizeof(a))初始化
对于指针,char *a = new char[n], 用memset(a, 0, n)初始化
[/Quote]
memset(a, 0, sizeof(a)) 初始化后更多乱码了。。。。
maoxing63570 2011-06-03
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 namelij 的回复:]
楼主,对于你的乱码问题
很大一部分在于初始化

对于数组,char a[n]; 用memset(a, 0, sizeof(a))初始化
对于指针,char *a = new char[n], 用memset(a, 0, n)初始化
[/Quote]
++
对于乱码问题,通常要么是没有初始化,要么是编码问题,但是在这里是没有初始化,你可以这样做
char a[n]={0},或者是像3楼说的那样,It's up to you
luciferisnotsatan 2011-06-03
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 luciferisnotsatan 的回复:]

编码问题
[/Quote]
此外,strBuffer[100]; 太小了,会有截断。

luciferisnotsatan 2011-06-03
  • 打赏
  • 举报
回复
编码问题
  • 打赏
  • 举报
回复
楼主,对于你的乱码问题
很大一部分在于初始化

对于数组,char a[n]; 用memset(a, 0, sizeof(a))初始化
对于指针,char *a = new char[n], 用memset(a, 0, n)初始化
p0303230 2011-06-03
  • 打赏
  • 举报
回复
memset初始化字符串吧

如果还是乱码,应该是编码格式的问题
v2002750 2011-06-03
  • 打赏
  • 举报
回复
strset(strBuffer,' ');
字符串是这么初始化的?

iResult = recv(s,strBuffer,100,0);
字符串结束符在哪里?

65,186

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧