最近在做项目过程中,遇到了一些中文问题,就是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发送出去,问题得到解决
|