На форуме изифлеша был интересный вопрос, как прочитать русские id3 теги из mp3. Автор в принципе нашел решение, только не верно указал кодировку. Немного полазив в нете оказалось, что эти теги записываются в кодировке ISO-8859-1. А я по такому случаю написал маленький класс с статической функцией, которая преобразовывает текст из кодировки ISO-8859-1 в кодировку windows-1251.
А вот код класса:
package { import flash.utils.ByteArray; /** * @author Maxim Sidorkin aka hitab * @site http://byflasher.com/ */ public class id3Rus { public function id3Rus() { } /* * Функция возвращает русское название переданного в нее свойства id3 тега * Т.н. передаем в функцию название песни, автора или любое другое свойства id3 тега * и получаем нормальную строчку с русскими буквами */ static public function convert(s:String):String { // Создаем битовый массив var ba:ByteArray = new ByteArray(); // Записываем в него значение строки в указанной кодировке ba.writeMultiByte(s, "ISO-8859-1"); // Выставляем 0 позицию ba.position = 0; // Возвращаем строку в нормальной кодировке return ba.readMultiByte(ba.length, 'windows-1251'); } } }
Чтобы протестировать киньте этот код в класс рядом с fla и в нем в первом кадре вбейте нижеприведенный код и измените путь к mp3-шке
import id3Rus; var snd:Sound = new Sound(); // любая mp3 с русским исполнителем и/или названием песни snd.load(new URLRequest("some.mp3")); snd.play(); snd.addEventListener(Event.ID3, id3Handler) //чтение тэгов function id3Handler(event:Event):void { trace("До конвертации \t" + snd.id3.artist + " - " + snd.id3.songName); trace("После конвертации \t" + id3Rus.convert(snd.id3.artist + " - " + snd.id3.songName)); trace(); }
p.s. почему функция id3Handler выполняется 2 раза не знаю =/
18 октября 2011, 21:17
id3Handler выполняется дважды, если в файле прописаны id3-тэги и первой, и второй версии. Тогда флеш их дважды читает.
18 октября 2011, 21:22
спасибо, теперь буду знать =)