`
happear
  • 浏览: 47179 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

AS3 Socket 汉字乱码深入研究

    博客分类:
  • AS3
阅读更多

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

在做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端编码的经验,查看实际编码得到的字节值,你也就能够找到合适的编码集来解决问题了。

 

3
0
分享到:
评论
2 楼 liusp_eye 2014-12-12  
虽然这帖子过去很久了,还是说两句:
1. writeUTFBytes这个方法一看就知道是用来处理字符集的

2.第二,我用JAVA的NIO,前端用的这个方法,还是有中文乱码;  
1 楼 weixinghao 2012-05-17  
你这个不准确。
writeMultiByte(strTest,"utf8")之所以没有转换成utf-8格式,是因为你后面的参数写错了。
应该写成:
writeMultiByte(strTest,"utf-8"),这样你试试,汉字就是3个字节了。

相关推荐

Global site tag (gtag.js) - Google Analytics