AS3 编码问题UTF-8、GBK

来源:互联网 发布:sql server设置外键 编辑:程序博客网 时间:2024/05/29 14:40

字符编码一直以来都是很混乱,非常让人令人头痛的问题,许多新手往往就会卡死在这个地方。出现乱码常见于读取、提交和写入这三个环节,稍微处理不好这个问题,结果都会演变变成乱码。 归根到底是由于各家使用的编码格式不同造成的,而且往往涉及到系统本身。 国内常用的网络编码格式有UTF-8、GB2312、GBK,以及繁体字的BIG5,这几个编码之间的转换郁闷了好多人。

在ActionScript 3 内部无论出和入都统一使用Unicode,但服务器那边却是千奇百怪的编码,例如Google使用UTF-8,百度似乎是GBK。于是向百度这样的服务端发出URLRequest请求百分百会出现乱码,无论设置什么Content Type 或者Post Method都如此,因为AS3输出的是UTF,而百度不接受这样的编码。而URLRequest本身也不支持自定义编码,百度服务端用什么编码也不是我们能控制的,所以烦死人的问题就这样出来了。唯一能让我们控制的只有AS3,所以解决办法还是要从AS3上去考虑。浪费了大量时间去查阅,基本没有人提到URL编码的问题。最后终于找到解决的思路,就是利用ByteArray对象的编码转换和存储功能,活用ByteArray类,能处理绝大部分的AS3编码问题。

原理不再多说,一个上午的努力最后转化成这样一个编码的类包:

// ==============================================================

package com.nosword.string
{
 import flash.utils.ByteArray;
 public class UrlMultiEncode
 {
    // this is an encode class by http://www.nosword.com   
  public function UrlMultiEncode():void
  {
  }
  
  public static function urlencodeGB2312(str:String):String{
   var result:String ="";
   var byte:ByteArray =new ByteArray();
   byte.writeMultiByte(str,"gb2312");
   for(var i:int;i<byte.length;i++){
    result += escape(String.fromCharCode(byte[i]));
   }
   return result;
  }

  public static function urlencodeBIG5(str:String):String{
   var result:String ="";
   var byte:ByteArray =new ByteArray();
   byte.writeMultiByte(str,"big5");
   for(var i:int;i<byte.length;i++){
    result += escape(String.fromCharCode(byte[i]));
   }
   return result;
  }

  public static function urlencodeGBK(str:String):String{
   var result:String ="";
   var byte:ByteArray =new ByteArray();
   byte.writeMultiByte(str,"gbk");
   for(var i:int;i<byte.length;i++){
    result += escape(String.fromCharCode(byte[i]));
   }
//   trace(result);
   return result;
  }

 }
}

// ==============================================================
/*

使用方法,从源代码那里可以看到是静态的函数调用,即:

import com.nosword.string.UrlMultiEncode;
...
..
trace(UrlMultiEncode.urlencodeGB2312("北京欢迎你"));
..

显示结果就是“%B1%B1%BE%A9%BB%B6%D3%AD%C4%E3”,用编码转换小工具解码对比,完全一致,支持不同编码格式的Urlencode终于成功了。

*/


其实AS3的ByteArray提供了指定编码模式的读/写:


参考API文档:

readMultiByte () 方法   public function readMultiByte(length:uint, charSet:String):String 语言版本 :  ActionScript 3.0 Player 版本 :  Flash Player 9 使用指定的字符集从字节流中读取指定长度的多字节字符串。 参数  length:uint — 要从字节流中读取的字节数。     charSet:String — 表示用于解释字节的字符集的字符串。 可能的字符集字符串包括 "shift-jis"、"cn-gb"、"iso-8859-1"”等。 有关完整列表,请参阅Supported Character Sets。 注意:如果当前系统无法识别 charSet 参数的值,则 Flash Player 将采用系统的默认代码页作为字符集。 例如,charSet 参数的值(如在使用 01 而不是 1 的 myTest.readMultiByte(22, "iso-8859-01") 中)可能在您的开发计算机上起作用,但在其它计算机上可能不起作用。 在另一台计算机上,Flash Player 将使用系统的默认代码页。 返回  String — UTF-8 编码的字符串。  引发  EOFError — 没有足够的数据可供读取。  

writeMultiByte () 方法   public function writeMultiByte(value:String, charSet:String):void 语言版本 :  ActionScript 3.0 Player 版本 :  Flash Player 9 使用指定的字符集将多字节字符串写入字节流。 参数  value:String — 要写入的字符串值。     charSet:String — 指示要使用的字符集的字符串。 可能的字符集字符串包括 "shift-jis"、"cn-gb"、"iso-8859-1"”等。 有关完整列表,请参阅Supported Character Sets。  


原创粉丝点击