关于utf-8 unicode gbk的转换的理解

为了用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");

解码:
new String(en.getBytes("iso8859-1"),"utf-8");

原理还是没弄明白。。。。。。






  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值