正所谓眼见为实,耳听为虚,在编程开发时,听别人说的东西一定要自己进行验证。因为网络这个东西,跟风的东西太多,以讹传讹的事情比比皆是。
近来在做AS3与.net的socket通信工作,相继解决了通信协议解析和数据粘包等问题,终于要跟汉字编码这个问题一争高下了。在经历了一番深入研究之后,我终于将汉字乱码这个问题彻底解决了,以后不管它AS3的socket要跟谁通信,我的办法都可以让你在面临汉字乱码问题时知道该怎么办了。
要说as3的socket发送汉字,首先得认识as3的两个类:flash.net.Socket和flash.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编码的话,就用ByteArray的writeUTFBytes函数来解决问题。不要再用
writeMultiByte(strTest,"utf8")了。这个函数是不会将汉字转化成UTF编码的。
至于.net端,我就不多着笔墨了,要在.net端转化汉字编码时,Encoding和
UnicodeEncoding这两个类打开看看,使用合适的编码类和函数就可以解决问题了。实在还是有问题,按照我解决flash端编码的经验,查看实际编码得到的字节值,你也就能够找到合适的编码集来解决问题了。
分享到:
相关推荐
防止Socket传递汉字乱码,防止Socket传递汉字乱码
FLASH AS3 SOCKET收发16进制示例
简单地描述了实现对as3 Socket的使用,对于初学者有一定的帮助
敝人近期整理的客户端与服务端通信实例,数据编码约定采用UTF-8编码,解决中文乱码问题.ServerSocket组件可以同时接受一个或多个ClientSocket组件的连接请求,并与每个ClientSocket组件建立单独的连接,进行单独的...
flash as3.0 socket编程
flash actionscript3游戏开发之as3的socket通信方式介绍即使用XMLSocket.zip
资源名称:flash as3.0 socket编程 资源太大,传百度网盘了,链接在附件中,有需要的同学自取。
as3socket写的rtmp协议类,完成基本的连接功能,可以获取服务器返回的16进制数据
AS3 SOCKET,关于AS3网络同步控制,SOCKET技术,延时等问题解决
简单说下 这是一本 从网上下载的 关于 as3 socket 开发的书的整理
两者之间使用基于TCP的Socket通信方式。可是,做了一个测试小例子,结果从客户端传过来的都是乱码。于是上网查,希望可以找到解决方法,可是,网上有好多的答案,经过了很多的实验,都不能很好的解决。没办法只能靠...
AS3使用Socket的简单例子.txt,源码+说明
基于vue3+socket.io的聊天应用,比较完整,略好看 基于vue3+socket.io的聊天应用,比较完整,略好看 基于vue3+socket.io的聊天应用,比较完整,略好看 基于vue3+socket.io的聊天应用,比较完整,略好看 基于vue3...
as3与java简单socket交互demo
flash actionscript3 as3通信 教程 socket与服务器通信, 多个swf之间通信.zip
as socket详解,全面了解ActionScript Socket 与后台通信机制
flash使用socket通讯的一个挺好的例子哦``
as3与java 进行socket通信的测试程序。
java3d socket编程 java3d socket编程 java3d socket编程 java3d socket编程 java3d socket编程