26.01.2011 22:35

ladykoshaПерлушка для превращения текста со всякими &xxx; и &#nnn; в нормальный utf8

1
2
3
4
#!/usr/bin/perl
use HTML::Entities;
binmode ("STDOUT", ":utf8");
print decode_entities(<>);



Для превращения текста со всякими &xxx; и &nnn; в обычный utf8.

Понадобилось из-за штуки, которая в виде таких numeric character references и character entity references сохраняет всё, что не основные символы (латиница, цифры и что-то ещё по минимуму). Кириллицу, например.

use HTML::Entities; - там сделали главную часть работы за меня :)
binmode ("STDOUT", ":utf8"); - чтобы Perl не ругался на необходимость печатать расшифрованное :)
print decode_entities(<>); - читать справа налево. Берём нечто со stdin - <>. Превращаем в вид желаемый - decode_entities. И печатаем - print - на stdout.

Модуль HTML::Entities мне даже ставить не пришлось, в дебиане (сквизе) он в пакете libhtml-parser-perl, который был установлен по зависимостям к rss-читалке.

Советы по улучшению или замене на лучшее приму с благодарностью. :)
Сделано было по принципу "лишь бы быстро справиться с задачей". Справилось.


Тэги: entities perl utf8
+ 22 -
Похожие Поделиться

Q2W 26.01.2011 22:45 #
Супер!
freefd 27.01.2011 05:53 #
perl -MHTML::Entities -e"use open ':locale';print decode_entities <>"
ladykosha 27.01.2011 07:46 #
Спасибо.
Если локаль не utf8, не потеряется ли часть символов? Скажем, если в тексте кроме кириллицы греческий. Или ещё что-нибудь интересное. Я понимаю, что сейчас другие локали уже не рекомендуются. Да и мне проверить не на чем. Но... :)
cblp 27.01.2011 08:43 #
convmv --unescape
ladykosha 27.01.2011 09:13 #
Если я правильно поняла, convmv решает другую задачу. Он конвертирует имена файлов.
cblp 27.01.2011 09:32 #
Да, действительно. Я неправильно понял автора. Просто мне самому часто приходилось переименовывать файлы, названные таким способом, а с раскодированием текста не встречался.