socket通信传递中文出现乱码

服务端使用JSP,客户端为Android,通过socket通信传递数据时遇到中文乱码问题。在将数据插入MySQL时正常,发布后乱码出现。解决方法是在服务端和客户端设定统一的字符编码为utf-8,确保传输过程中编码一致。

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

服务端为JSP,客户端为Android。未将服务端发布时,在程序里数据能正常插入到mysql,发布后,数据使用socket通信传递,然后传中文出现乱码了。如果我把思路理清一些的话,应该很快能找到问题所在并解决问题的,可是啊!!!终究还是浪费了好多时间去解决。


解决方法,在服务端和客户端传输的时候都加上一个编码指定,我的是utf-8。

服务端:


public static final String bm="utf-8"; //全局定义,以适应系统其他部分 

BufferedReader in = new BufferedReader(new InputStreamReader(
process.getInputStream(),bm));
PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(process.getOutputStream(),bm)),true);

客户端:
public static final String bm="utf-8"; //全局定义,以适应系统其他部分 
PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(client.getOutputStream(),bm)),true);
BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream(),bm));

参考文章:
http://blog.sina.com.cn/s/blog_49f485700100qdt2.html

http://www.2cto.com/kf/201209/155337.html



### MFC Socket 中接收中文乱码解决方案 在 MFC 应用程序中使用 `Socket` 接收数据时,如果接收到的数据包含中文字符并出现乱码现象,通常是因为编码不一致引起的。以下是针对该问题的分析以及解决方案。 #### 1. 原因分析 当通过网络传输数据时,发送方和接收方可能采用不同的字符集或编码方式处理字符串。常见的编码方式包括 UTF-8、GBK 和 ASCII 等。如果双方未约定统一的编码标准,则可能导致接收端无法正确解析发送端的字符数据,从而引发乱码问题[^1]。 #### 2. 解决方法 为了确保在网络通信过程中能够正确传递和显示中文字符,可以采取以下措施: ##### (1) 统一编码格式 建议在应用程序设计阶段就明确规定一种通用的编码形式用于整个系统的文本交换过程。例如可以选择广泛支持且兼容性强的标准——UTF-8 编码作为默认选项。这样无论是在 Windows 平台还是其他操作系统环境下都能保持一致性。 ```cpp // 将宽字节串转换成指定编码下的多字节串(如UTF-8) std::string ConvertWideCharToUtf8(const std::wstring& wstrInput){ int nLen = WideCharToMultiByte(CP_UTF8, NULL, wstrInput.c_str(), -1, NULL, 0, NULL, FALSE); char* pszAnsiStr = new char[nLen]; memset(pszAnsiStr,'\0',nLen); WideCharToMultiByte(CP_UTF8,NULL,wstrInput.c_str(),-1,(LPSTR)pszAnsiStr,nLen,NULL,FALSE); std::string strResult((const char*)pszAnsiStr); delete[] pszAnsiStr; return strResult; } ``` ##### (2) 数据接收后的解码操作 假设服务器端按照 GBK 或者 UTF-8 发送过来带有汉字的信息,在客户端需要先读取原始二进制流再依据相应规则将其还原为可识别的文字表示形式。下面给出一段示范代码展示如何利用 MultiByteToWideChar 函数完成从特定编码至 Unicode 字符串之间的转变[^1]: ```cpp // 把utf8编码转成Unicode(wchar_t*) void Utf8ToWString(const char* utf8Buf,int iSize,std::wstring &wszOutput){ int widelen=MultiByteToWideChar(CP_UTF8,0,utf8Buf,iSize,nullptr,0); wchar_t *pwch=new wchar_t[widelen+1]; pwch[widelen]='\0'; MultiByteToWideChar(CP_UTF8,0,utf8Buf,iSize,pwch,widelen); wszOutput.assign(pwch); delete []pwch; } // 使用示例 CStringA recvData; // 假设这是接收到的数据 std::wstring unicodeText; Utf8ToWString(recvData.GetBuffer(),recvData.GetLength()*sizeof(char),unicodeText); ``` 以上两部分分别展示了如何进行编码前准备(即把本地使用的宽字符转化为适合网络传播的形式),以及怎样对接受到的内容做适当调整使其恢复正常状态的过程。 #### 3. 总结 综上所述,要彻底解决 MFC 下基于 Sockets 实现通讯时遇到的中文乱码难题,关键是做到两点:一是事先协商好彼此间遵循何种编码协议;二是根据实际情况灵活运用相关 API 完成必要的编/解码工作。只有这样才能保证跨平台应用中的文字交流畅通无阻。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值