近日,我在学习Android网络通讯的时候遇到了字符集编码问题。
我的客户端:java.net.Socket
我的服务端:System.Net.Sockets
我在经过测试后,发现C#下的SOCKET在接收与发送时都是以字节流的形式传输的,所以发送方与接收方的字节编码一定要一致才行。
一、第一种情形
Android端:
InputStream in = socket.getInputStream();
PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(),"gb2312")), true);
C#服务端:
string result = System.Text.Encoding.Default.GetString(socketData.dataBuffer);
我原来一直使用System.Text.Encoding.Default来处理接收到字节流,开始时都正常,Default==“gb2312”。但后来我把Android端的输出流也改为了字节流的形式后,服务端总是接收到乱码,后来发现是字节编码不一致造成的。
二、第二种情形
Android端:
DataInputStream in = new DataInputStream(socket.getInputStream());
DataOutputStream out = new DataOutputStream(socket.getOutputStream());
发送:
try {
byte[] datas = msg.getBytes("utf-8");
out.write(datas,0,datas.length);
} catch (IOException e) {
e.printStackTrace();
}
接收:
int result = in.available();
while (result == 0) {
result = in.available();
}
byte[] data = new byte[result];
in.read(data);
String content = new String(data, "utf-8");
C#服务端:
接收
string result = System.Text.Encoding.UTF8.GetString(socketData.dataBuffer);
发送
byte[] byData = System.Text.Encoding.UTF8.GetBytes(msg);
soket.Send(byData);
通过上述的实验证明,为了确保在不同的平台下,客户端输入的中文可以被正确地解析、保存、读取。最好的办法就是使用UTF-8编码。
在Android端和服务端显式的声明编码方式即可。