ID3乱码不再是Flash播放器的瓶颈
分类: Flash | 标签: AS3, Flash | 日期:2008-02-16 | 1 views
本文的最新更新在此处
有感于frank发布在闪无忧上的一篇文章DataArray之烦人的ID3乱码
它完美的解决了在flash编程中无法正确获得正确的中文ID3信息.
堪称Flash编码史上的一座里程碑
但是有一点点不完整,如果ID3标签本身就是UTF-8编码的,那经过转换出来的信息岂不是又成了火星文了.
看下面一个例子,是几首歌曲的ID3标签和16位的编码以及经过UTF-8转换函数处理之后的标签
HEX: c3 84 c3 a3 c3 97 c3 ae c2 bd c3 bc c2 bb c2 b9 c2 ba c3 83 c3 82 c3 b0
Encoded: 你最近还好吗
originalString: Äã×î½ü»¹ºÃÂð
HEX: e6 97 a5 e4 b8 8d e8 90 bd
Encoded: 鏃ヤ笉钀
originalString: 日不落
HEX: c3 80 c3 ab c3 88 c3 8b
Encoded: 离人
originalString: ÀëÈË
上面HEX代表originalString原始字符串的16位编码,Encoded是原始字符串经过转换后处理的结果.
可以看到本身就是UTF-8的编码比较短,而非UTF-8的编码前面均以c3或者c2开始.那就将c2,c3作为条件来判断是否需要转换.
十六进制的c3就是十进制的195,于是修改为
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | function EncodeUtf8(str : String):String {
if (str!=null) {
var oriByteArr : ByteArray = new ByteArray();
oriByteArr.writeUTFBytes(str);
for (var i = 0; i trace(oriByteArr[i].toString(16));
}
if (oriByteArr[0]==195 || oriByteArr[0]==194) {
var tempByteArr : ByteArray = new ByteArray();
for (var i = 0; i if (oriByteArr[i] == 194) {
tempByteArr.writeByte(oriByteArr[i+1]);
i++;
} else if (oriByteArr[i] == 195) {
tempByteArr.writeByte(oriByteArr[i+1] + 64);
i++;
} else {
tempByteArr.writeByte(oriByteArr[i]);
}
}
tempByteArr.position = 0;
trace('/');
for (var i = 0; i trace(tempByteArr[i].toString(16));
}
return tempByteArr.readMultiByte(tempByteArr.bytesAvailable,"chinese");
} else {
return str;
}
} else {
return "";
}
} |
经过测试,ANSI和Unicode-BE下的GBK编码能够正确显示,而BIG5编码还是相当顽固和恶心的,不知道在繁体XP作業系統上使用usecodepage会不会好一点
Feb 24th 2008,Update:Flash中Sound的ID3标签乱码的通用转码解决

