关于SOCKET C语言编程

C语言 码拜 6年前 (2015-05-11) 482次浏览 0个评论

自己学教程用SOCKET 写接受网页源码的一个程序,然后及就是recv()函数接收的源码全都是乱码,我已经按网上说的确定了 都是UFT-8的编码  所以自认为不是编码的问题  然后就不知道哪里出问题了 求网友指点 指点,ps:只有中文的字符才出现了问题,然后接收到的字符保存为html文件 代开文字一切正常

控制台输出UTF-8编码的字符串这要系统支持吧。。比如中文版Windows默认一般默认是GB系列编码
一定要输出的话转换成GBK之类的再输出吧。。或者至少转换成UCS-2编码再输出吧
可是为什么 当我的VS输出中文的时候(中文不是来自网页就是简单的printf(“中文”);)显示乱码,然后当我设置了UFT-8就OK了呢??
socket你设置是以stream形式的吧。那么就是字节流,需要相同的编码形式
10分
引用 楼主 qq_25235869 的回复:

自己学教程用SOCKET 写接受网页源码的一个程序,然后及就是recv()函数接收的源码全都是乱码,我已经按网上说的确定了 都是UFT-8的编码  所以自认为不是编码的问题  然后就不知道哪里出问题了 求网友指点 指点,ps:只有中文的字符才出现了问题,然后接收到的字符保存为html文件 代开文字一切正常

ConvertUtf8ToGBK(CString& strUtf8) 
{
int len=MultiByteToWideChar(CP_UTF8, 0, (LPCTSTR)strUtf8, -1, NULL,0);
unsigned short * wszGBK = new unsigned short[len+1];
memset(wszGBK, 0, len * 2 + 2);
MultiByteToWideChar(CP_UTF8, 0, (LPCTSTR)strUtf8, -1, wszGBK, len);

len = WideCharToMultiByte(CP_ACP, 0, wszGBK, -1, NULL, 0, NULL, NULL);
char *szGBK=new char[len + 1];
memset(szGBK, 0, len + 1);
WideCharToMultiByte (CP_ACP, 0, wszGBK, -1, szGBK, len, NULL,NULL);
strUtf8 = szGBK;
delete[] szGBK;
delete[] wszGBK;
}
中文用这个函数转换一下就可以了

10分
接收到的数据保存成文件打开后就正常,这说明传输是没问问题了。主要是这里有好几个问题没搞清:
1.这里不知道楼主是什么系统,用的什么编译环境。这里假设是Windows和VC吧、
2.发送端发送的是什么编码?按照你说是UTF-8,这没问题。我猜测你传输的可能是UTF-8编码的htm文件。
3.程序看到是乱码,是如何看的?是通过调试还是通过打印。如果你用的是VC,那么VC无论是调试还是打印都不支持UTF-8,只支持GBK(这么说其实不准确,可以粗浅这么认为)。如果网络数据本身是UTF-8,那么如果要在程序中输出,请转换一下编码后printf,用4楼的API就可以,也可以用开源库。
3.至于printf(“中文”)显示是乱码,取决于你承载这句话的源文件是什么编码。对于编译器来说只是输出的两个引号之间的东西,里面是什么就是什么。如果是VC,可能会做得多一些。如果原文件是用GB码保存的,输出一般没问题。如果源文件是用加了BOM头的UTF-8保存的,编译器其实会自动把UTF-8转码为本地码,也没问题。如果没有BOM头的UTF-8,这时候编译器无法识别UTF-8,就无法转码,那么可能就会有问题
4.你把接收到了内容保存成文件,打开又没乱码,这说明你网络编程没问题。因为只要是二进制传输,网络这里其实就是原样拷贝而已,原来是啥就是啥。打开的时候,你的记事本或者文本工具会自动识别,自认没乱码了。
不知道有多少前人掉在TCP Socket
send(人多)send(病少)send(财富)
recv(人多病)recv(少财富)
陷阱里面啊!
http://bbs.csdn.net/topics/380167545

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明关于SOCKET C语言编程
喜欢 (0)
[1034331897@qq.com]
分享 (0)

文章评论已关闭!