Форум русскоязычного сообщества Ubuntu


Хотите сделать посильный вклад в развитие Ubuntu и русскоязычного сообщества?
Помогите нам с документацией!

Автор Тема: Не правильная кодировка метатегов в потоке  (Прочитано 1229 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн ivsatel

  • Автор темы
  • Активист
  • *
  • Сообщений: 336
    • Просмотр профиля
Всех с новым годом!
Сервер радио вещания отдает тэги такого содержания, интересует поле title:
[('organization', 'USSR 50-70'), ('codec', 'MPEG-1 Layer 3 (MP3)'), ('title', '303210303201303220303200303203303210303214303216303202 303220303245303255303240303262 - 303221303245303242303240303261303262303256303257303256303253303274303261303252303250303251 303202303240303253303274303261')]

Где перед каждым символом кириллицы ставится 3032, затем непосредственно сам символ. Что это за кодировка? Вот часть символов, что успел разобрать:
(Нажмите, чтобы показать/скрыть)

Оффлайн ReNzRv

  • Старожил
  • *
  • Сообщений: 2648
    • Просмотр профиля
Декодер:
Код: (perl) [Выделить]
#!/usr/bin/perl

my %ru = (
'00' => 'А',
'01' => 'Б',
'02' => 'В',
'03' => 'Г',
'04' => 'Д',
'05' => 'Е',
'06' => 'Ж',
'07' => 'v',
'10' => 'И',
'11' => 'Й',
'12' => 'К',
'13' => 'Л',
'14' => 'М',
'15' => 'Н',
'16' => 'О',
'17' => 'П',
'20' => 'Р',
'21' => 'С',
'22' => 'Т',
'23' => 'У',
'24' => 'Ф',
'25' => 'Х',
'26' => 'Ц',
'27' => 'Ч',
'30' => 'Ш',
'31' => 'Щ',
'32' => 'Ъ',
'33' => 'Ы',
'34' => 'Ь',
'35' => 'Э',
'36' => 'Ю',
'37' => 'Я',
'40' => 'а',
'41' => 'б',
'42' => 'в',
'43' => 'г',
'44' => 'д',
'45' => 'е',
'46' => 'ж',
'47' => 'з',
'50' => 'и',
'51' => 'й',
'52' => 'к',
'53' => 'л',
'54' => 'м',
'55' => 'н',
'56' => 'о',
'57' => 'п',
'60' => 'р',
'61' => 'с',
'62' => 'т',
'63' => 'у',
'64' => 'ф',
'65' => 'х',
'66' => 'ц',
'67' => 'ч',
'70' => 'ш',
'71' => 'щ',
'72' => 'ъ',
'73' => 'ы',
'74' => 'ь',
'75' => 'э',
'76' => 'ю',
'77' => 'я'
);

while (<>) { s/3032([0-9]{2})/$ru{$1}/g; print }

Using:
perl decode.pl text.txtили
echo 'текст' | perl decode.pl
« Последнее редактирование: 03 Января 2017, 10:40:25 от renzrv »

Оффлайн ivsatel

  • Автор темы
  • Активист
  • *
  • Сообщений: 336
    • Просмотр профиля
Да, я тоже пришел к такому выводу, что декодировать получится только "в ручную". А кодировка похоже самописная, только для чего...

Оффлайн ReNzRv

  • Старожил
  • *
  • Сообщений: 2648
    • Просмотр профиля
Нет, не самописная, это восмеричное (octal) представление из кодировки CP1251
(Нажмите, чтобы показать/скрыть)
Код - последние две цифры в первой колонке.

Код: (text) [Выделить]
echo '303210303201303220303200303203303210303214303216303202 303220303245303255303240303262 - 303221303245303242303240303261303262303256303257303256303253303274303261303252303250303251 303202303240303253303274303261' | perl decode.pl
ИБРАГИМОВ Ренат - Севастопольский Вальс

Оффлайн ivsatel

  • Автор темы
  • Активист
  • *
  • Сообщений: 336
    • Просмотр профиля
renzrv, Спасибо!
Получилось вот так:
(Нажмите, чтобы показать/скрыть)
Осталось понять происхождение приставки 303 в начале.

Оффлайн peregrine

  • FSM
  • СуперМодератор
  • Старожил
  • *
  • Сообщений: 7203
  • Gentoo x64 Ubuntu 16.04.1 x64
    • Просмотр профиля
ivsatel, а можно было просто использовать iconv (это не только консольная программа, но ещё и библиотека) и не городить велосипеды.

Оффлайн ivsatel

  • Автор темы
  • Активист
  • *
  • Сообщений: 336
    • Просмотр профиля
peregrine, Не спорю, в каком-то из случаев можно было бы использовать как iconv так и recode. Но мне нужно решить это только силами интерпретатора, и желательно нативными.

Оффлайн ReNzRv

  • Старожил
  • *
  • Сообщений: 2648
    • Просмотр профиля
Получилось вот так:
А чем мой вариант не подошел? Если реально нужны все остальные символы-кракозябры (только зачем?), тогда нужно всего лишь добавить второй хэш и одну! строку замены:
(Нажмите, чтобы показать/скрыть)

Пользователь добавил сообщение 04 Января 2017, 12:46:53:
просто использовать iconv
Просто как-то не получилось, пробовал по такой схеме:
octal -> binary -> ( from CP1251 to utf8 )
« Последнее редактирование: 04 Января 2017, 12:47:43 от renzrv »

Оффлайн ivsatel

  • Автор темы
  • Активист
  • *
  • Сообщений: 336
    • Просмотр профиля
renzrv,
А чем мой вариант не подошел?
Так я по образу и подобию свой "блэкджэк запилил")
Использую изначально Python3,
для хранения данных использовал словарь
для обработки цикл.
Структура "программы" считаю аналогична, реализована лишь разными инструментами и да, словарь создал "полный" с "кракозябрами" на всякий случай)
Вот еще вариант для iso-8859-5, немного сложнее достать значения получилось:
(Нажмите, чтобы показать/скрыть)
И повторюсь, спасибо за man iso_8859-5 и man cp1251, не знал о их существовании)

Оффлайн ReNzRv

  • Старожил
  • *
  • Сообщений: 2648
    • Просмотр профиля
Самый правильный вариант с Iconv:
Код: (perl) [Выделить]
#!/usr/bin/perl

use Text::Iconv;
my $conv = Text::Iconv->new('cp1251','utf8');

while (<>) {
s/30(2|3)2([0-9]{2})/$conv->convert(pack('I*', oct($1 . $2)))/eg;
print;
}

На питоне думаю тоже можно сделать подобное.

 

Страница сгенерирована за 0.032 секунд. Запросов: 25.