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


Увидели сообщение с непонятной ссылкой, спам, непристойность или оскорбление?
Воспользуйтесь ссылкой «Сообщить модератору» рядом с сообщением!

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

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

Оффлайн ivsatel

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

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

Оффлайн ReNzRv

  • Старожил
  • *
  • Сообщений: 2628
    • Просмотр профиля
Декодер:
Код: Perl
  1. #!/usr/bin/perl
  2.  
  3. my %ru = (
  4. '00' => 'А',
  5. '01' => 'Б',
  6. '02' => 'В',
  7. '03' => 'Г',
  8. '04' => 'Д',
  9. '05' => 'Е',
  10. '06' => 'Ж',
  11. '07' => 'v',
  12. '10' => 'И',
  13. '11' => 'Й',
  14. '12' => 'К',
  15. '13' => 'Л',
  16. '14' => 'М',
  17. '15' => 'Н',
  18. '16' => 'О',
  19. '17' => 'П',
  20. '20' => 'Р',
  21. '21' => 'С',
  22. '22' => 'Т',
  23. '23' => 'У',
  24. '24' => 'Ф',
  25. '25' => 'Х',
  26. '26' => 'Ц',
  27. '27' => 'Ч',
  28. '30' => 'Ш',
  29. '31' => 'Щ',
  30. '32' => 'Ъ',
  31. '33' => 'Ы',
  32. '34' => 'Ь',
  33. '35' => 'Э',
  34. '36' => 'Ю',
  35. '37' => 'Я',
  36. '40' => 'а',
  37. '41' => 'б',
  38. '42' => 'в',
  39. '43' => 'г',
  40. '44' => 'д',
  41. '45' => 'е',
  42. '46' => 'ж',
  43. '47' => 'з',
  44. '50' => 'и',
  45. '51' => 'й',
  46. '52' => 'к',
  47. '53' => 'л',
  48. '54' => 'м',
  49. '55' => 'н',
  50. '56' => 'о',
  51. '57' => 'п',
  52. '60' => 'р',
  53. '61' => 'с',
  54. '62' => 'т',
  55. '63' => 'у',
  56. '64' => 'ф',
  57. '65' => 'х',
  58. '66' => 'ц',
  59. '67' => 'ч',
  60. '70' => 'ш',
  61. '71' => 'щ',
  62. '72' => 'ъ',
  63. '73' => 'ы',
  64. '74' => 'ь',
  65. '75' => 'э',
  66. '76' => 'ю',
  67. '77' => 'я'
  68. );
  69.  
  70. while (<>) { s/3032([0-9]{2})/$ru{$1}/g; print }
  71.  

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

Оффлайн ivsatel

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

Оффлайн ReNzRv

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

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

Оффлайн ivsatel

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

Оффлайн peregrine

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

Оффлайн ivsatel

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

Оффлайн ReNzRv

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

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

Оффлайн ivsatel

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

Оффлайн ReNzRv

  • Старожил
  • *
  • Сообщений: 2628
    • Просмотр профиля
Самый правильный вариант с Iconv:
Код: Perl
  1. #!/usr/bin/perl
  2.  
  3. use Text::Iconv;
  4. my $conv = Text::Iconv->new('cp1251','utf8');
  5.  
  6. while (<>) {
  7.         s/30(2|3)2([0-9]{2})/$conv->convert(pack('I*', oct($1 . $2)))/eg;
  8.         print;
  9. }

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

 

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