`
happear
  • 浏览: 47961 次
  • 性别: 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个字节了。

相关推荐

    防止Socket传递汉字乱码

    本篇文章将深入探讨如何防止Socket传递汉字乱码,确保数据传输的正确性。 1. **字符编码理解** - 字符编码是计算机表示和处理文本的方式,常见的有ASCII、GBK、UTF-8等。ASCII只包含英文字符,GBK是中国常用的编码...

    FLASH AS3 SOCKET收发16进制示例

    在AS3中,我们可以使用Socket类来实现这一功能。本示例主要探讨如何在Flash AS3中使用Socket类来发送和接收16进制数据。 首先,让我们理解16进制。16进制(Hexadecimal)是一种逢16进1的进位制,主要用于表示计算机...

    as3_Socket_的简单实例

    AS3中的`Socket`类是Flash Player 9引入的新特性,用于创建基于TCP/IP协议的网络连接。Socket连接允许应用程序直接与远程服务器进行低级别的数据通信,而不依赖于特定的应用层协议,如HTTP或HTTPS。这种直接的连接...

    java Socket与C#通信中中文乱码问题的解决方案

    在Java和C#之间进行Socket通信时,遇到中文乱码问题主要是由于编码格式不一致导致的。Java默认使用UTF-8编码,而C#在处理字符串时可能使用其他编码,如GBK或ASCII。为了解决这个问题,我们需要确保两端在发送和接收...

    flash as3.0 socket编程

    Flash AS3.0 Socket 编程 Flash AS3.0 中的 Socket 编程是使用 ActionScript 3.0 进行网络编程的一种方式。它允许 Flash 应用程序与服务器之间建立连接,以便进行数据交换。下面是关于 Flash AS3.0 Socket 编程的...

    as3_socket

    ### AS3 Socket编程详解 #### 一、引言 在当今互联网时代,实时通信变得尤为重要。ActionScript 3.0(AS3)作为Flash平台的主要编程语言之一,提供了强大的网络功能,包括Socket编程的支持。本文将详细介绍AS3中的...

    Delphi TCPIP通信 实例 解决中文乱码问题 SOCKET SERVER-CLIENT

    敝人近期整理的客户端与服务端通信实例,数据编码约定采用UTF-8编码,解决中文乱码问题.ServerSocket组件可以同时接受一个或多个ClientSocket组件的连接请求,并与每个ClientSocket组件建立单独的连接,进行单独的...

    flash actionscript3游戏开发之as3的socket通信方式介绍即使用XMLSocket.zip

    本文将深入探讨AS3中的Socket通信方式,特别是利用XMLSocket进行网络交互的细节。 首先,XMLSocket是AS3中用于低级网络通信的类,它提供了双向、全双工的数据流,适合于游戏开发中的实时数据交换,如玩家状态同步、...

    AS3使用Socket的简单例子.txt

    ### AS3使用Socket的简单例子 #### 知识点概览 - **AS3 Socket编程基础** - **创建与配置XMLSocket对象** - **事件监听器的设置与使用** - **连接服务器及发送数据** - **接收服务器响应** #### 知识点详细解析 #...

    flashas3.0socket编程

    资源名称:flash as3.0 socket编程 资源太大,传百度网盘了,链接在附件中,有需要的同学自取。

    flash as3 socket编程基础

    ### Flash AS3 Socket编程基础知识详解 #### 一、引言 在现代互联网应用开发中,实时通信技术变得越来越重要。而Socket编程作为一种实现客户端与服务器之间实时数据交换的有效手段,在Flash开发领域同样占据着重要...

    as3与java简单socket交互demo

    这个"as3与java简单socket交互demo"应该包含了实现上述功能的代码示例,你可以通过解压提供的文件并进行运行和调试,来更深入地理解AS3和Java如何通过Socket进行通信。学习和实践这些基本概念是开发实时、高效率网络...

    as3socket写的rtmp协议类

    as3socket写的rtmp协议类,完成基本的连接功能,可以获取服务器返回的16进制数据

    (AS3)socket+客户端与服务端+实例

    本文将深入探讨基于ActionScript 3(AS3)的Socket通信,包括客户端与服务端的交互,以及如何通过提供的实例来理解这一过程。我们将不涉及具体代码,而是详细解释相关的概念和技术要点。 首先,Socket是网络编程中...

    一段as3.0与c++socket通信的例子(as端代码)

    通过对这个文件进行分析,可以深入了解AS3.0客户端如何与C++服务器进行Socket通信的具体实现细节。 总之,AS3.0的Socket通信能力使得Flash和C++等不同平台之间能够进行实时、高效的数据交换,这对于构建跨平台的...

    as3-java socket

    本文将深入探讨“as3-java socket”这个主题,这是关于使用ActionScript 3(AS3)与Java进行Socket通信的一个测试程序。AS3是Adobe Flash Platform的主要编程语言,而Java Socket API则是用于实现网络上的双向通信的...

    flash as3/java socket 聊天室

    标题中的“flash as3/java socket 聊天室”指的是使用Adobe Flash ActionScript 3(AS3)语言和Java的Socket编程技术实现的一个在线聊天应用程序。这个应用允许用户通过网络进行实时通信,创建一个基本的聊天环境。...

    java和as3 socket通信 解决安全沙箱问题

    Java和ActionScript 3 (AS3) 的Socket通信在实现跨平台交互时是常见的技术手段,尤其是在处理实时数据传输和游戏开发中。然而,由于AS3运行在Flash Player的沙箱环境中,它受到一系列安全限制,包括不能直接与非同一...

    AS3 Socket 基础知识(很全面) 1

    AS3 Socket基础知识是网络通信的重要组成部分,特别是在网络时代,它被广泛应用于各种应用程序中,因为“一切皆Socket”。网络进程间的通信需要一个唯一标识,TCP/IP协议族通过IP地址识别网络主机,结合传输层的...

Global site tag (gtag.js) - Google Analytics