Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 24.11.2011, 10:56
HardCoder вне форума Посмотреть профиль Отправить личное сообщение для HardCoder Найти все сообщения от HardCoder
  № 1  
Ответить с цитированием
HardCoder
 
Аватар для HardCoder

блогер
Регистрация: Apr 2011
Сообщений: 583
Записей в блоге: 2
По умолчанию Как определить допустимые ли в строке символы

Здравствуйте. Потребовалось вытянуть русские id3 теги из mp3 файлов. Нашел на форуме такой код
Код AS3:
		private function convertID3(data:String):String {
			var b:ByteArray = new ByteArray();
			for (var i:uint = 0; i < data.length; i++){
				b[i] = data.charCodeAt(i);
			}
			return b.readMultiByte(b.bytesAvailable, "win-1251");
		}
С его помощью русские теги уже отображаются, но лишь в 1 случае из 50-ти. Дальнейший поиск результатов не дал, и пришлось смириться с тем, что не у всех файлах русские теги будут отображаться.
Теперь стала задача: если функция convertID3 возвращает мне английский или русский текст - значит вывожу его в текстовое поле. Если получаю иероглифы - то в поле вывожу другой текст. Но как мне узнать что она возвратила: нормально читаемый человеком текст, или квадратики и пр. знаки?
__________________
Я мало чего умею, но зато хорошо умею учиться...

Старый 24.11.2011, 13:05
trng вне форума Посмотреть профиль Отправить личное сообщение для trng Найти все сообщения от trng
  № 2  
Ответить с цитированием
trng

Регистрация: Jun 2011
Сообщений: 212
Код-то вы нашли, а комменты прочитать поленились.
Для внутреннего хранения значений с типом String в AS3 используются символы Unicode в формате UTF-16. И charCodeAt возвращает 16-разрядное число, а не восьмиразрядный win-1251.
(http://www.flasher.ru/forum/showthre...highlight=1251)

Что касается текста в ID3, то с английским там проблем быть не может, а c кириллицей проблем не будет только если при создании тегов использована кодировка utf-16 (и это относится не только к AS3).

Старый 24.11.2011, 14:44
HardCoder вне форума Посмотреть профиль Отправить личное сообщение для HardCoder Найти все сообщения от HardCoder
  № 3  
Ответить с цитированием
HardCoder
 
Аватар для HardCoder

блогер
Регистрация: Apr 2011
Сообщений: 583
Записей в блоге: 2
Цитата:
Сообщение от trng Посмотреть сообщение
Код-то вы нашли, а комменты прочитать поленились.
Не поленился, просто код нашел в совсем другой теме.
По сути:
Значит в 1 из 50-ти треков при создании тегов использована кодировка utf-16, а в остальных нет? Значит мне никак не получить из них данные в нужном формате, потому что сам String по своей природе представлен в UTF-16?
Если так, то вопрос открыт: Как узнать что возвратила функция: читаемый русский или английский текст, или квадраты?
__________________
Я мало чего умею, но зато хорошо умею учиться...

Старый 24.11.2011, 15:56
trng вне форума Посмотреть профиль Отправить личное сообщение для trng Найти все сообщения от trng
  № 4  
Ответить с цитированием
trng

Регистрация: Jun 2011
Сообщений: 212
Проблема не в том, что в AS3 тип String - это UTF-16. Проблема в криворукости тех, кто создавал те самые mp3 c id3 тегами используя нестандартные кодировки. Ну а корень проблем - в id3v1 отсутствует поддержка кириллицы (и вообще всего что не ISO-8859-1).

В результате во многих случаях настоящая кодировка id3 тега не может быть идентифицирована однозначно.

В вашем случае (скорее всего) коды win1251 интерпретируются как коды ISO-8859-1.
Причем интерпретируются не вами, а классом ID3Info.
Повлиять на его поведение вы не можете.
Анализировать "белиберду", которая при этом получается - занятие весьма неблагодарное.
Для справки: до сих пор не сущесвует надежного алгоритма определения кодировок (восьмибитных) для текстовых файлов (почитайте php-форумы на эту тему). А существующие алгоритмы позволяют лишь оценить вероятность и очень сильно языкоориентированы (например - используя частотный анализ букв, начало слов с "неправильных букв" и т.п.).

Ваша задача - как раз подобная.

Если вам таки хочется поизвращаться - попробуйте сравнивать символы в полученной строке регулярным выражением с маской типа [a-zA-Z0-9а-яА-Я]. Если "попаданий" мало, значит, скорее всего, кодировка битая.
Можете еще добавить в маску знаки препинания.

Старый 24.11.2011, 16:10
DaFive вне форума Посмотреть профиль Отправить личное сообщение для DaFive Посетить домашнюю страницу DaFive Найти все сообщения от DaFive
  № 5  
Ответить с цитированием
DaFive
 
Аватар для DaFive

Регистрация: May 2008
Адрес: {0,0}
Сообщений: 754
Записей в блоге: 1
Отправить сообщение для DaFive с помощью ICQ
Ну если совсем в лоб: сделать таблицу кодов допустимых символов (String#charCodeAt) и если в неё не попадает - слать лесом.
__________________
Кодинг, багинг, алгоритминг. me @

Старый 24.11.2011, 16:24
HardCoder вне форума Посмотреть профиль Отправить личное сообщение для HardCoder Найти все сообщения от HardCoder
  № 6  
Ответить с цитированием
HardCoder
 
Аватар для HardCoder

блогер
Регистрация: Apr 2011
Сообщений: 583
Записей в блоге: 2
Спасибо, думал это можно решить какой-нибудь хитроумной комбинацией свойств String. Видать, придется заниматься перебором строк.
__________________
Я мало чего умею, но зато хорошо умею учиться...

Создать новую тему Ответ Часовой пояс GMT +4, время: 03:01.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 03:01.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.