ID3乱码不再是Flash播放器的瓶颈

分类: 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标签乱码的通用转码解决

你也许会喜欢的日志

目前还没有人发表评论  ↓发表评论↓

[ Ctrl+Enter提交 ]

3437471453591321281023251740504243322112038418334931126263041298715442436271424616193932548

Freelance PHP Developer