PDA

Просмотр полной версии : ID3 теги - кодировка


AzagThoth
22.04.2010, 23:56
Пытаюсь получить данные о песне.
trace(snd.id3.artist)
В оутпут:
Êèïåëîâ è Ìàâðèí
В реале информация прописана на русском. Ясно что проблема с определением кодировки. Что можно предпринять?

in4core
23.04.2010, 00:29
usecodePage пробовал ?

AzagThoth
23.04.2010, 02:16
useCodepage (System.useCodepage property)
public static useCodepage : Boolean

A Boolean value that tells Flash Player whether to use Unicode or the traditional code page of the operating system running the player to interpret external text files. The default value of System.useCodepage is false.

When the property is set to false, Flash Player interprets external text files as Unicode. (These files must be encoded as Unicode when you save them.)
When the property is set to true, Flash Player interprets external text files using the traditional code page of the operating system running the player.
Text that you load as an external file (using the loadVariables() or getURL() statements, or the LoadVars class or XML class) must be encoded as Unicode when you save the text file in order for Flash Player to recognize it as Unicode. To encode external files as Unicode, save the files in an application that supports Unicode, such as Notepad on Windows 2000.

If you load external text files that are not Unicode-encoded, you should set System.useCodepage to true. Add the following code as the first line of code in the first frame of the SWF file that is loading the data:

System.useCodepage = true;

When this code is present, Flash Player interprets external text using the traditional code page of the operating system running Flash Player. This is generally CP1252 for an English Windows operating system and Shift-JIS for a Japanese operating system. If you set System.useCodepage to true, Flash Player 6 and later treat text as Flash Player 5 does. (Flash Player 5 treated all text as if it were in the traditional code page of the operating system running the player.)

If you set System.useCodepage to true, remember that the traditional code page of the operating system running the player must include the characters used in your external text file in order for the text to display. For example, if you load an external text file that contains Chinese characters, those characters cannot display on a system that uses the CP1252 code page because that code page does not include Chinese characters.

To ensure that users on all platforms can view external text files used in your SWF files, you should encode all external text files as Unicode and leave System.useCodepage set to false by default. This way, Flash Player 6 and later interprets the text as Unicode.

Availability: ActionScript 1.0; Flash Player 6

Т.к. значение по дефолту false - то делаю так:
System.useCodepage = true;
trace(snd.id3.artist)
В оутпут:
Êèïåëîâ è Ìàâðèí
К сожалению безуспешно. ОС Windows 7 x64 Ultimate
В общем совершенно не понятно что делать. Как починить буквы :(

Добавлено через 58 минут
В общем вот что я накопал здесь (http://www.flasher.ru/forum/showthread.php?t=114885).
Хоть тема и про AS3, но суть похоже одна. Дело в том, что в Win 7, Win Vista использована кодировка отличная от Win XP, Win 2000. Пришёл к такому выводу ещё давно, когда базы 1С не хотели работать после перехода на Win Vista.
Следовательно если ID3 теги были написаны в ОС Win XP. А там ведь не Юникод используется в этих целях. То и в семёрке выходит их не получится прочесть ни как юникод, ни используя кодировку ОС. Вот такая красотень. Но всё не много не так. Так как если попробовать в Win7 откредактировать ID3 теги, написав что нибудь другое на русском, то текст всё равно в любом случае выводится кракозябрами. Значит теги ID3 задаются всё таки строго в своей кодировке и она по видимому не зависит от кодировки кодировки ОС. Судя по той теме ссылку на которую дал в AS3 в насильном задавании кодировки помогает ByteArray, однако в AS2 этой фенечки вообще нет. Что же делать?
Чрезвычайно интересно существует ли какой компонент который можно был бы подключить для автоматического определения кодировки - аля Штирлиц. Или быть может его придётся написать самому(ну хотя бы попробовать), с трудом себе это сейчас представляю.

etc
23.04.2010, 03:40
Ну можете составить таблицу соответствий кодов cp1251 к нормальной кодировке.

AzagThoth
23.04.2010, 04:26
Могу, только может её уже кто до меня составил :) Как насчёт компонентов? Не знаете нет такого случайно?

Добавлено через 42 минуты
В общем вот. Пре-альфа. Весь русский алфавит :) Может позже расширю включив если будет нужно какие доп. символы(но вроде все остальные не отличаются), но пока хватит и этого.
function cp1251toUnicode(str:String):String{
var new_str:String="";

var arr:Array=[];
arr[192]="А";
arr[193]="Б";
arr[194]="В";
arr[195]="Г";
arr[196]="Д";
arr[197]="Е";
arr[168]="Ё";
arr[198]="Ж";
arr[199]="З";
arr[200]="И";
arr[201]="Й";
arr[202]="К";
arr[203]="Л";
arr[204]="М";
arr[205]="Н";
arr[206]="О";
arr[207]="П";
arr[208]="Р";
arr[209]="С";
arr[210]="Т";
arr[211]="У";
arr[212]="Ф";
arr[213]="Х";
arr[214]="Ц";
arr[215]="Ч";
arr[216]="Ш";
arr[217]="Щ";
arr[218]="Ъ";
arr[219]="Ы";
arr[220]="Ь";
arr[221]="Э";
arr[222]="Ю";
arr[223]="Я";
arr[224]="а";
arr[225]="б";
arr[226]="в";
arr[227]="г";
arr[228]="д";
arr[229]="е";
arr[184]="ё";
arr[230]="ж";
arr[231]="з";
arr[232]="и";
arr[233]="й";
arr[234]="к";
arr[235]="л";
arr[236]="м";
arr[237]="н";
arr[238]="о";
arr[239]="п";
arr[240]="р";
arr[241]="с";
arr[242]="т";
arr[243]="у";
arr[244]="ф";
arr[245]="х";
arr[246]="ц";
arr[247]="ч";
arr[248]="ш";
arr[249]="щ";
arr[250]="ъ";
arr[251]="ы";
arr[252]="ь";
arr[253]="э";
arr[254]="ю";
arr[255]="я";

for(var i=0; i<str.length; i++){
if(arr[str.charCodeAt(i)]!=undefined){
new_str+=arr[str.charCodeAt(i)];
} else{
new_str+=str.charAt(i);
}
}

return new_str;
}

etc
23.04.2010, 05:28
Ну вообще можно обойтись и без таблицы. Начать со 192-ого кода в cp1251 и 1040 в unicode и шлепать в цикле. Т. е. всего где-то строчек пять будет. Только мне лень это писать.

AzagThoth
23.04.2010, 05:58
К сожалению только относительные позиции Ё-1025 и ё-1105 в юникоде и Ё-168 и ё-184 в cp1251 не совпадают. Хотя их можно и насильно прописать :)
function cp1251toUnicode(str:String):String{
var new_str:String="";

var arr:Array=[];
arr[168]="Ё";
arr[184]="ё";
for(var i=1040; i<1104; i++){
arr[i-848]=String.fromCharCode(i);
}

for(var i=0; i<str.length; i++){
if(arr[str.charCodeAt(i)]!=undefined){
new_str+=arr[str.charCodeAt(i)];
} else{
new_str+=str.charAt(i);
}
}

return new_str;
}
Спасибо за идею.
Разумеется мой код не очень оптимален. Массив логичнее создать вне функции и использовать его потом. А не создавать постоянно заново. В общем это бета :)

etc
23.04.2010, 07:58
Да его вообще не надо было создавать.

AzagThoth
23.04.2010, 17:41
Ну можно и не создавать конечно. Тогда так:
function cp1251toUnicode(str:String):String{
var new_str:String="";

for(var i=0; i<str.length; i++){
if(str.charCodeAt(i)>191){
new_str+=String.fromCharCode(str.charCodeAt(i)+848);
} else if(str.charCodeAt(i)==168){
new_str+="Ё";
} else if(str.charCodeAt(i)==184){
new_str+="ё";
} else{
new_str+=str.charAt(i);
}
}

return new_str;
}
Хотя это тоже, конечно, не пять строчек кода :)

iflamberg
23.04.2010, 18:01
А вот в AS3 есть
ByteArray.writeMultiByte(value:String, charSet:String):void
;)

AzagThoth
23.04.2010, 18:16
Ну раз уже тема про "музЫку", тогда имею большое желание спросить тут же. Нельзя ли случайно в AS3 изготовить графический эквалайзер(аля светомузыка)? Просто в AS2 на сколько понял это в принципе невозможно, т.к. мы можем только знать играется песня или нет, а о её изменяющихся частотно-амплитудных характеристиках можем только воображать.

iflamberg
23.04.2010, 19:14
можно. SoundMixer.computeSpectrum (), кажется. У него правда есть недостаток. Если флеш в другой флешке уже играет звук, то он выбрасывает ошибку и не работает. Говорят, ее можно обойти, но тогда спектр получается от звука и своей мелодии и той, что играет другая флешка.

AzagThoth
23.04.2010, 19:53
Спасибо, хотя бы успокоил себе сердце, что когда дочитаю книжку по AS2, и примусь за AS3, то научусь уметь и это :)