AS3 Socket 汉字乱码深入研究

正所谓眼见为实,耳听为虚,在编程开发时,听别人说的东西一定要自己进行验证。因为网络这个东西,跟风的东西太多,以讹传讹的事情比比皆是。

在做AS3.netsocket通信工作,相继解决了通信协议解析和数据粘包等问题,终于要跟汉字编码这个问题一争高下了。在经历了一番深入研究之后,我终于将汉字乱码这个问题彻底解决了,以后不管它AS3socket要跟谁通信,我的办法都可以让你在面临汉字乱码问题时知道该怎么办了。

要说as3socket发送汉字,首先得认识as3的两个类:flash.net.Socketflash.utils.ByteArray,这两个类的协作关系就是ByteArray

字符串(包括汉字)按照特定的编码格式转化成字节数组,然后Socket类将这个字节数组发送出去。整体思路是很简单的。

  但是这里面有个陷阱或者说很多人在讲解flash乱码问题时没有说清楚的问题。这也是我开始遇到乱码问题时非常困惑的地方。首先,我们来介绍这个问题的所在:

ByteArray有两个函数可以转化汉字成字节数组:

第一个是writeMultiByte;另

第二个是writeUTFBytes;

这两个方法有何区别?

这正是乱码问题之所在!我们来做个试验加以说明.试验方式如下:设定一个字符串“曹操”,然后分别用ByteArray的这两个方法将其转化成字节数组,然后读出字节数组的内容看看结果,看到字节数组内容的时候大家就会有所收获了。

var arrBuffer:ByteArray=new ByteArray(); var strTest:String="曹操"; arrBuffer.writeMultiByte(strTest,"utf8");

    

         读出这个字节数组的内容,得到的字节值是:-78 -36 -78 -39 ,每个汉字占两个字节。我们在来看下面的例子

       var arrBuffer:ByteArray=new ByteArray(); var strTest:String="曹操"; //arrBuffer.writeMultiByte(strTest,"utf8"); arrBuffer.writeUTFBytes(strTest);

    

  读出这个字节数组的内容,得到的字节值是:-26 -101 -71 -26 -109 -115 ,很明显的,每个汉字占到三个字节。

  

  陷阱已经显露出来了,在解决汉字乱码这个问题的时候,我查了很多的网上信息,见到最多的一行代码就是arrBuffer.writeMultiByte(strTest,"utf8")了,也不做什

说明,根本就是误人子弟嘛。现在,这个问题被我揪出来了。大家如果还有什么疑问,就继续往下看。

经我查证,Unicode字符集在编码汉字的时候,应该是一个汉字三个字节的,为何第一次试验的时候用arrBuffer.writeMultiByte(strTest,"utf8");得到的却是一个汉字两个字节呢?我又试验性的将编码格式那个参数换成"gbk""gb2312",结果得到的字节数组与"utf8"时一样。我还没有搞清楚这是参数失效还是Adobe有别的什么考虑。但是试验已经很清楚的告诉我们了一个事实:如果你想将汉字用真正的

UTF-8编码的话,就用ByteArraywriteUTFBytes函数来解决问题。不要再用

writeMultiByte(strTest,"utf8")了。这个函数是不会将汉字转化成UTF编码的。

 

      至于.net端,我就不多着笔墨了,要在.net端转化汉字编码时,Encoding

UnicodeEncoding这两个类打开看看,使用合适的编码类和函数就可以解决问题了。实在还是有问题,按照我解决flash端编码的经验,查看实际编码得到的字节值,你也就能够找到合适的编码集来解决问题了。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值