用AS2解決中文ID3的亂碼

來源:互聯網
上載者:User
解決|中文

flash如果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);
}

輸出結果:
丁香花
到此為此我們已經解決了這個亂碼問題,使用這個技巧也可以解決其他的亂碼問題!



相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。