如何解码Flash中Sound的ID3标签的乱码
分类: Flash, 代码 | 标签: ActionScript, AS3, Flash | 日期:2008-02-24 | 1 views
在ID3乱码不再是Flash播放器的瓶颈中,我改进的代码虽然加入了判断是否需要转换的条件,但实际上条件比这要复杂的多.
后来再应用的时候,出错了才知道有几处地方会影响条件的判断.
例如,下面两个需要转换的字符串,开头的代码均不是c3,c2.因此误判.
Pakk Hui-ѪÃÅͽÖ÷ÌâÇú
50 61 6b 6b 20 48 75 69 2d c3 91 c2 aa c3 83 c3 85 c3 8d c2 bd c3 96 c3 b7 c3 8c c3 a2 c3 87 c3 ba
S.H.E-Äã×î½ü»¹ºÃÂð
53 2e 48 2e 45 2d c3 84 c3 a3 c3 97 c3 ae c2 bd c3 bc c2 bb c2 b9 c2 ba c3 83 c3 82 c3 b0
上面例子的第一个字符串Pakk Hui中间有一个20的值,是空格.如果按照判断每个字符的高位是否是c3,c2的话,到空格这里就会影响后面的条件判断,因为空格只占用一个位置.所以,遇到空格要将判断的位置向前倒退一格.
经过若干次试验,相信这次代码不会有太大的问题了.修改的代码如下(注意!!Caution!!此代码仅适用于AS3脚本。因为里面的ByteArray只有AS3才有):
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 31 32 33 34 35 36 | function EncodeUtf8(str:String):String {
if (str != null) {
var oriByteArr:ByteArray=new ByteArray ;
oriByteArr.writeUTFBytes(str);
var needEncode:Boolean=false;
for (var i=0; i < oriByteArr.length; i+= 2) {
if (oriByteArr[i] == 195 || oriByteArr[i] == 194) {
needEncode=true;
break;
}
if (oriByteArr[i] == 32) {
i--;
}
}
if (needEncode) {
var tempByteArr:ByteArray=new ByteArray ;
for (i=0; i < oriByteArr.length; 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;
return tempByteArr.readMultiByte(tempByteArr.bytesAvailable,"chinese");
} else {
return str;
}
} else {
return "";
}
} |
目前还没有人发表评论 ↓发表评论↓

