为了用java服务器把汉字传给android手机,找了不少资料,费了好大功夫,/走了不少弯路,既然学都学了,还是总结一下,备忘。
最终解决方案
in = new BufferedReader(new InputStreamReader(socket.getInputStream(),"UTF-8"));
out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(),"UTF-8"));
参考下文:
http://blog.csdn.net/mecho/article/details/7342654
先前用发送用的PrintWriter out = new PrintWriter(socket.getInputStream());
接收 InputStream inStream = incoming.getInputStream();
Scanner in = new Scanner(inStream);
实际上只需要把发送改了就可以了
弯路:
因为是要转汉字,所以最先的思路是把字符串先编码发送,接收端再解码。以前用过base64,但考虑到base64效率应该会比较低,实际也做了测试。
于是开始研究字符串编码
编码:new String(s.getBytes("utf-8"))
这样处理后,手机端也不用做什么解码,基本上能显示。但正如网上很多人问到的,如果是奇数的话,最后一个字是乱码。后来测试发现,不仅仅是最后一个字,“邀请....”的邀字放在前面就会乱,放在中间就没事。
折腾了好久,在手机端加解码也不行.....
按理说这样和正确方案的做做法应该能起到相同的作用啊?为什么不行呢?也没时间研究它了。。。。
用s.getByte("gbk"),根本就没有认识的字
还有没弄明白的是:
在服务器上的字符串,为什么就一定要转码昵?难道在socket传送时丢失了信息?以至于接收端无法还原?
为此我做了一个测试,发送一个汉字“好”,发送前用getBytes()查看,是两个字节,可到发接收端,却变成了6个字节,中间做了什么转换呢?不是按二进制传输的吗?
不写了,学海无涯啊。。。。。
还是总结一下:
网上有很多关于字符编码的资料,大部份介绍编码方法,我觉得也没有必要去了解那么细,了解多了反而容易弄晕。
我觉得需要了解以下几点:
1,操作系统接受什么样的编码
2,把操作系统不能接受的编码转换成能接受的编码
如何将汉字转换成iso8859-1?
错误的方法:
new String(s.getBytes(),"iso8859-1");
s.getBytes()基本等同于s.getBytes("iso8859-1"),所以会造成数据丢失,没有意义
正确的方法:
String en=new String(s.getBytes("utf-8"),"iso8859-1");
或
String en=new String(s.getBytes("gbk"),"iso8859-1");