Utf-8编码处理(解决c++/MFC下的乱码问题)

头文件引用:#include <string>
 void CGetpostDlg::UTF8toANSI(CString &strUTF8)
{
	USES_CONVERSION;
	char * strutf8 = W2A(strUTF8);
	//获取转换为多字节后需要的缓冲区大小,创建多字节缓冲区
	UINT nLen = MultiByteToWideChar(CP_UTF8, NULL, strutf8, -1, NULL, NULL);
	WCHAR *wszBuffer = new WCHAR[nLen + 1];
	nLen = MultiByteToWideChar(CP_UTF8, NULL, strutf8, -1, wszBuffer, nLen);
	wszBuffer[nLen] = 0;

	nLen = WideCharToMultiByte(936, NULL, wszBuffer, -1, NULL, NULL, NULL, NULL);
	CHAR *szBuffer = new CHAR[nLen + 1];
	nLen = WideCharToMultiByte(936, NULL, wszBuffer, -1, szBuffer, nLen, NULL, NULL);
	szBuffer[nLen] = 0;
	string szbuffer = szBuffer;
	strUTF8 = szbuffer.c_str();
	//清理内存
	delete[]szBuffer;
	delete[]wszBuffer;
}
void CGetpostDlg::ANSItoUTF8(CString &strAnsi)
{
	USES_CONVERSION;
	char * stransi = W2A(strAnsi);
	//获取转换为宽字节后需要的缓冲区大小,创建宽字节缓冲区,936为简体中文GB2312代码页
	UINT nLen = MultiByteToWideChar(936, NULL, stransi, -1, NULL, NULL);
	WCHAR *wszBuffer = new WCHAR[nLen + 1];
	nLen = MultiByteToWideChar(936, NULL, stransi, -1, wszBuffer, nLen);
	wszBuffer[nLen] = 0;
	//获取转为UTF8多字节后需要的缓冲区大小,创建多字节缓冲区
	nLen = WideCharToMultiByte(CP_UTF8, NULL, wszBuffer, -1, NULL, NULL, NULL, NULL);
	CHAR *szBuffer = new CHAR[nLen + 1];
	nLen = WideCharToMultiByte(CP_UTF8, NULL, wszBuffer, -1, szBuffer, nLen, NULL, NULL);
	szBuffer[nLen] = 0;
	string szbuffer = szBuffer;
	strAnsi = szbuffer.c_str();
	//内存清理
	delete[]wszBuffer;
	delete[]szBuffer;
}

问题的原因可能是你没有正确处理接收到的数据。在你的代码中,你使用了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.csdn.net/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.csdn.net/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、付费专栏及课程。

余额充值