用AS2彻底解决onID3的乱码-深入FLASH编码转码机制!

      AS3 2004-11-30 12:03:00
如果MP3的ID3标签使用GB2312编码,那么在FLASH脚本输出时是乱码的
代码1
var s:Sound=new Sound(this);
s.loadSound("dxh.mp3",false);
s.onID3=function(){
    trace(this.id3.songname);
}
输入结果是:
¶¡Ï㻨
dxh.mp3的ID3v1的标签正确应该是songname="丁香花",看来FLASH在转码上出现了问题。
我们来看看songname这个字符串中倒底是什么?
代码2:
var s:Sound=new Sound(this);
s.loadSound("dxh.mp3",false);
s.onID3=function(){
    var songname:String=this.id3.songname;
    for(var i=0;i<songname.length;i++){
        trace(songname.charCodeAt(i));
    }
}
输出结果是:
182
161
207
227
187
168
我们使用计算器转换成16进制就是"B6 A1 CF E3 BB A8";
正好是"丁香花"的GB2312编码,我们还是用FLASH来试试
System.useCodepage=true;
trace(unescape("%B6%A1%CF%E3%BB%A8"));
输出结果是:
丁香花
那么为什么代码1出现乱码现象,是因为FLASH将GB2312当作了UTF-8来解释,我们再来测试一下:
代码3:
var s:Sound=new Sound(this);
s.loadSound("dxh.mp3",false);
s.onID3=function(){
    var songname:String=this.id3.songname;
    trace(escape(songname));
}
结果是:
%3F%3F%3F%3F%3F%A1%A7
问题的原因我们找到了,只要将GB2312转换成UTF-8编码就能显示正常了,可是如果转换呢,大家注意看代码2,我再测试一下想法
代码4:
System.useCodepage=true;
var gb:String=unescape("%B6%A1%CF%E3%BB%A8");
System.useCodepage=false;
trace(gb);
trace(escape(gb));
输出结果:
丁香花
%E4%B8%81%E9%A6%99%E8%8A%B1
第二行就是“丁香花”的UTF-8编码,说明已经转换成功了,我们来具体实现这个过程

class lm.utils.LUTF {
    
    public function toUTF(source:String):String{
        var target:String="";
        for(var i=0;i<source.length;i++){
            target+=this.codeTohex(source.charCodeAt(i));
        }
        System.useCodepage=true;
        target=unescape(target);
        System.useCodepage=false;
        return target;
    }
    private function codeTohex(code:Number):String{
        var low:Number=code%16;
        var high:Number=(code-low)/16;
        return "%"+hex(high)+hex(low);
    }
    private function hex(code:Number):String{
        switch(code){
            case 10:
                return "A";
                break;
            case 11:
                return "B";
                break;
            case 12:
                return "C";
                break;
            case 13:
                return "D";
                break;
            case 14:
                return "E";
                break;
            case 15:
                return "F";
                break;
            default:
                return String(code);
                break;
        }
    }
}

我们再来测试一下
import lm.utils.LUTF;
var u=new LUTF();
var s:Sound=new Sound(this);
s.loadSound("dxh.mp3",false);
s.onID3=function(){
    var songname:String=_root.u.toUTF(this.id3.songname);
    trace(songname);
}
输出结果:
丁香花
到此为此我们已经解决了这个乱码问题,使用这个技巧也可以解决其他的乱码问题!
标签集:TAGS:
回复Comments() 点击Count()
喜欢就顶一下

回复Comments

{commentauthor}
{commentauthor}
{commenttime}
{commentnum}
{commentcontent}
作者:
{commentrecontent}