如何解码Flash中Sound的ID3标签的乱码
目前还没有人发表评论 | 赶紧发表评论吧| 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才有):
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 "";
}
}
纯脚本带频谱分析AS3 FlashMp3Player 暂命名为[FlowPlayer]
目前还没有人发表评论 | 赶紧发表评论吧| 1 views
从2月18日开始写实现代码,边写代码变设计的布局.目前仅完成了播放列表,时间显示,播放和停止按钮.走马灯文本框组件.
下一步将完成频谱显示类以及细化核心与周边显示模块的连接和事件响应.
这期间,遇到了不少困难.如类之间传递事件,类之间的调用.因为对继承还不太熟悉,所有的类都没有写成互相继承的关系,因此,只好将核心作为参数传送给其他模块供调用.目前最得意的就是,整个播放器成品大小才8.2Kb,仅仅到目前为止的大小.放个图上来.
此内容的最新成品在这里:您抬头看上面的导航,从左往右第二个就是。
或者点此访问

关于[艳照门]
目前还没有人发表评论 | 赶紧发表评论吧| 1 views
最近网上闹得沸沸扬扬的”艳照门”事件,起因大多数’热心的网友’都非常了解:有人在修手提电脑的过程中在电脑硬盘里发现了一些明星的裸照,并将其在网络上传播开来,也因此使广大网民和众多粉丝争相观看,更有甚者,将其作为商品出售.
可以说,这是一次事故.如果要定性的看的话,这是一起侵犯个人隐私的给社会带来恶劣影响的人为造成的侵权事件.
个人看来,所有出现在照片中的人都是受害者,在毫不知情的情况下,他们的照片被各种群体传阅或者用于商业目的,被媒体炒作.给照片中的每一个人都带来深刻的心理伤害.当然,给每个热心的网友都带来千金不换的眼福.也让老百姓们知道了明星与常人无异.
从开始的一两张照片,到最后整套照片在网上打包下载,这真是有一股无穷的力量在驱使着人们睁大眼睛,四处寻找.表面上看,”粉丝们”积极的关心,不知道这种关心给艺人们带来的是什么后果.
媒体的炒作,网民的JJYY,充分说明了这个时代的特点,’人可怕,人的口水更可怕’.
陈冠希的离开说明了什么呢,无可奈何啊.自己的压箱照片让人给漏了出来还四处传播,一方面他自责把电脑拿出去给不熟的人修,另一方面,我想他应该对传播者非常怨恨吧
时代的丑闻,起源于人性的缺失.默哀ing.
一个纯代码写的AS3按钮类
有8人发表了评论 | 赶紧发表评论吧| 1 views
因为是第一次用类定义来写,难免代码效率会低.
因为想要用纯代码写一个支持多种频谱效果的AS3播放器,更想将所有需要的东西全都装进包里.因此,没打算用Flash自带的组件,一是组件拖动到库里之后,导出的文件大小呈几何数量级翻倍,二是,借此机会,真正和类亲密接触一回.
首先,将按钮类实现了.发现自己用代码绘制按钮并不难,但是需要很仔细的计算好每个细节,包括鼠标按下按钮之后移出按钮区域又移回来时候的按钮绘制.代码如下,调用的时候还得自己将函数添加到侦听列表中.
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 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 | import flash.display.Sprite; import flash.events.MouseEvent; import flash.events.*; import flash.display.GradientType; import flash.geom.Matrix; import flash.display.CapsStyle; import flash.display.LineScaleMode; class coolbutton extends Sprite { private var mybutton:Sprite; private var colormatrix:Matrix; private var colorarray:Array; private var ispressed:Boolean; public function coolbutton(height:Number=32,width:Number=64) { mybutton = new Sprite(); colorarray = new Array(); ispressed = false; colorarray = [0,148,148,255]; colormatrix = new Matrix(); colormatrix.createGradientBox(width,height,Math.PI/2,0,0); mybutton.height = height; mybutton.width = width; graphics.lineStyle(1,0x707070,1,true,LineScaleMode.NONE,CapsStyle.NONE,null,3); graphics.drawRoundRect(3,3,width-1,height-1,3,3); graphics.lineStyle(1,0xF3F3F3,1,true,LineScaleMode.NONE,CapsStyle.NONE,null,3); graphics.beginGradientFill(GradientType.LINEAR,[0xF5F5F5, 0xE0E0E0, 0xCFCFCF, 0xC0C0C0],[1,1,1,1],colorarray,colormatrix); graphics.drawRoundRect(4,4,width-3,height-3,3,3); graphics.endFill(); } public function onhover(event:Event) { var height = event.target.height; var width = event.target.width; if (ispressed) { graphics.lineStyle (1,0x2C628B,1,true,LineScaleMode.NONE,CapsStyle.NONE,null,3); graphics.drawRoundRect(3,3,width-1,height-1,3,3); graphics.lineStyle (1,0x63ACD3,1,true,LineScaleMode.NONE,CapsStyle.NONE,null,3); graphics.beginGradientFill(GradientType.LINEAR,[0xE5F4FC, 0xC4E5F6, 0x98D1EF, 0x6DB6DD],[1,1,1,1],colorarray,colormatrix); graphics.drawRoundRect(4,4,width-3,height-3,3,3); graphics.endFill(); } else { graphics.lineStyle (1,0x3C7FBE,1,true,LineScaleMode.NONE,CapsStyle.NONE,null,3); graphics.drawRoundRect(3,3,width-1,height-1,3,3); graphics.lineStyle (1,0xEFF9FE,1,true,LineScaleMode.NONE,CapsStyle.NONE,null,3); graphics.beginGradientFill(GradientType.LINEAR,[0xF5F5F5, 0xD9F0FC, 0xBEE6FD, 0xA7D9F5],[1,1,1,1],colorarray,colormatrix); graphics.drawRoundRect(4,4,width-3,height-3,3,3); graphics.endFill(); } } public function onout(event:Event) { var height = event.target.height; var width = event.target.width; graphics.lineStyle(1,0x707070,1,true,LineScaleMode.NONE,CapsStyle.NONE,null,3); graphics.drawRoundRect(3,3,width-1,height-1,3,3); graphics.lineStyle(1,0xF3F3FF,1,true,LineScaleMode.NONE,CapsStyle.NONE,null,3); graphics.beginGradientFill(GradientType.LINEAR,[0xF5F5F5, 0xE0E0E0, 0xCFCFCF, 0xC0C0C0],[1,1,1,1],colorarray,colormatrix); graphics.drawRoundRect(4,4,width-3,height-3,3,3); graphics.endFill(); } public function onpress(event:Event) { var height = event.target.height; var width = event.target.width; ispressed = true; graphics.lineStyle(1,0x2C628B,1,true,LineScaleMode.NONE,CapsStyle.NONE,null,3); graphics.drawRoundRect(3,3,width-1,height-1,3,3); graphics.lineStyle(1,0x63ACD3,1,true,LineScaleMode.NONE,CapsStyle.NONE,null,3); graphics.beginGradientFill(GradientType.LINEAR,[0xE5F4FC, 0xC4E5F6, 0x98D1EF, 0x6DB6DD],[1,1,1,1],colorarray,colormatrix); graphics.drawRoundRect(4,4,width-3,height-3,3,3); graphics.endFill(); } public function onrelease(event:Event) { var height = event.target.height; var width = event.target.width; ispressed = false; graphics.lineStyle(1,0x707070,1,true,LineScaleMode.NONE,CapsStyle.NONE,null,3); graphics.drawRoundRect(3,3,width-1,height-1,3,3); graphics.lineStyle(1,0xF3F3F3,1,true,LineScaleMode.NONE,CapsStyle.NONE,null,3); graphics.beginGradientFill(GradientType.LINEAR,[0xF5F5F5, 0xE0E0E0, 0xCFCFCF, 0xC0C0C0],[1,1,1,1],colorarray,colormatrix); graphics.drawRoundRect(4,4,width-3,height-3,3,3); graphics.endFill(); } public function onClick(event:Event) { trace(event.target,'is just being clicked'); } } |
ID3乱码不再是Flash播放器的瓶颈
目前还没有人发表评论 | 赶紧发表评论吧| 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,于是修改为
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标签乱码的通用转码解决


