C++ socket recv 乱码

本文介绍了一种在网络传输中将UTF-8编码的数据转换为本地ANSI编码的方法。通过使用MultiByteToWideChar和WideCharToMultiByte函数实现了编码的无缝转换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

因为网络传输过来的一般是UTF-8编码的,而本地肯定是ANSI编码的

所以就需要进行编码转化

主要代码事列如下:


 char text[1024*9]={0};
char buf[1024*10]={0};
	TCHAR wscBuffer[1024*10]={0};
	while(recv(socketfd,text,1024*9,0)>0){

		MultiByteToWideChar( CP_UTF8, 0, text, (int) strlen(text)+1, wscBuffer, sizeof(wscBuffer)/sizeof(wchar_t));

		memset(text,0,1024*9);

		WideCharToMultiByte( CP_ACP, 0, wscBuffer, -1,text, 1024*9, NULL, NULL);

		strcat(buf,text);
		strnset(text,'/0',BUFSIZ);
	}


问题的原因可能是你没有正确处理接收到的数据。在你的代码中,你使用了recv函数接收数据,并将其存储在buffer中。然而,由于每次接收的数据长度可能不等,你可能会遇到数据粘包的问题。这会导致接收到的数据乱码。 解决这个问题的方法是在接收数据前清空接收缓存。你可以使用memset函数将buffer清零,确保每次接收数据前都是一个干净的缓存。 另外,你还可以使用recv函数的返回值来判断接收数据的长度,以便正确处理接收到的数据。如果返回值小于等于0,表示接收失败或连接关闭。你可以根据返回值进行相应的错误处理。 下面是一个示例代码片段,展示了如何正确处理接收到的数据: ```c++ #include <iostream> #include <cstring> // 定义接收缓存的大小 #define BUFFER_SIZE 1024 int main() { // 创建接收缓存 char buffer[BUFFER_SIZE]; // 清空接收缓存 memset(buffer, 0, BUFFER_SIZE); // 使用recv函数接收数据 int recv_size = recv(accept_fd, buffer, BUFFER_SIZE, 0); if (recv_size <= 0) { perror("recv fail"); close(accept_fd); return -1; } // 处理接收到的数据 // ... return 0; } ``` 希望这个解决方法可以帮助你解决recv接到乱码的问题。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [MFC UDP服务器接收数据乱码问题。](https://blog.youkuaiyun.com/weixin_32880357/article/details/119528634)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [基于c语言的socket乱码解决](https://blog.youkuaiyun.com/weixin_43262162/article/details/125957308)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值