flash客户端与服务端传输中文出现乱码的问题
C++服务端每次接受一条字符串信息,需要固定字节
例如C++服务端需要接受一条用户名的信息,名字长度是32个字节,也就是说,C++服务端每次要 获取名字的时候
都是在socket中读取32个字节,不管flash客户端输入的用户名是否有32个字节]
这样的话,flash客户端就要做一些处理
也就是当用户输入用户名达不到32个长度时,我们必须给他补长度
起初我是用socket的writeUTFBytes方法写入字符串,然后用一个ByteArray补上剩余的长度
下面是代码
var msg:String = "my name is soda";
socket.writeByte(msg);
var len:int = msg.length;
//算出剩余长度
byte.length = 32- len;
socket.writeUTFBytes(msg) ; //先发送名字
socket.writeBytes(byte); //再发送补的长度
(其实这是一个蠢方法,当时比较急,没仔细看api造成的)
但是这样做问题就来了
在flash的字符串中,不管是中文还是英文,都是一个字或者字母算一个长度,但是实际上中文是占两个字节,英文占一个字节
这样发送中文时就会出现错误
后来改用另外一种写法,就完全解决了,同时也可以发送特定的编码集
var msg:String = "my name is soda";
var byte = new ByteArray();
byte.writeMultiByte(msg, "gb2312"); //指定字符编码集
byte.length = 32;
socket.writeBytes(byte);
这样就很简单,就是把要发送的文字先写进ByteArray里
然后指定他的字节长度
最后用socket把ByteArray发送出去
问题得到解决
分享到:
相关推荐
例如,`writeUTFBytes()`用于发送UTF编码的字符串。 ```as3 socket.writeUTFBytes("Hello, World!"); ``` #### 2. 写入缓冲区 写入数据后,需要调用`flush()`方法将缓冲区中的数据发送出去。如果不调用`flush()`,...
9. AS3.0核心库:文档中提到了as3corelib,这是一个流行的AS3.0库,它提供了额外的函数和类,用于增强ActionScript的功能,例如字符串处理、加密、国际化、XML操作等。 10. 资源文件的引用与加载:通过public ...
- **变量和常量**:AS3 支持多种数据类型,包括整型、浮点型、布尔型、字符串等。变量可以在程序运行过程中改变值,而常量则不能修改。 - **数据类型**:AS3 包含了丰富的内置数据类型,如 `int`、`uint`、`Number`...
2. **数据流处理**:Socket对象的readUTFBytes方法读取接收到的数据,writeUTF方法用于发送UTF-8编码的字符串。 3. **事件驱动编程**:AS3.0的EventDispatcher机制用于处理网络事件,如连接成功、数据到达和断开连接...
AS3提供了多种字符串编码方法,如UTF-8。在发送和接收数据时,我们需要确保两端使用相同的编码格式。 5. **状态管理**:聊天室需要维护用户的状态,例如在线/离线状态。这可以通过在服务器上存储每个用户的状态并在...
在ActionScript中,这些命令将以字符串形式通过Socket发送。 4. **SMTP身份验证**: 如果SMTP服务器需要身份验证,如用户名和密码,ActionScript中需要实现这个过程,可能涉及Base64编码等加密方法。 5. **邮件结构...
- **数据类型**:ActionScript 3.0 支持多种数据类型,包括数字(Number)、字符串(String)、布尔(Boolean)等。 - **处理对象**:对象是ActionScript 中的核心概念,通过对象可以组织和封装数据及行为。 - **属性**:...
内含各种例子(vc下各种控件的使用方法、标题栏与菜单栏、工具栏与状态栏、图标与光标、程序窗口、程序控制、进程与线程、字符串、文件读写操作、文件与文件夹属性操作、文件与文件夹系统操作、系统控制操作、程序...
Borqs 播思通讯 联盟目的 将会支持 Google 可能发布的手机操作系统或者应用软件,共同开发名为 Android 的开放源代码的移动 系 统。 谷歌早在 2002 年就进入了移动领域,可是由于目前的手机操作系统企业和手机企业...