HTML :: Кодировка сущностей и одиночный амперсанд - PullRequest
2 голосов
/ 21 мая 2011

Я пытаюсь использовать следующую строку perl, как описано здесь: Кто-нибудь знает о плагине или скрипте vim для преобразования специальных символов в соответствующие им объекты HTML? - для кодирования объектов HTML вVim.

%!perl -p -i -e 'BEGIN { use HTML::Entities; use Encode; } $_=Encode::decode_utf8($_) unless Encode::is_utf8($_);  $_=Encode::encode("ascii", $_, sub{HTML::Entities::encode_entities(chr shift)});'

Работает нормально (от £ до £, фигурные кавычки и т. Д.), За исключением амперсанда, который сам по себе - & - остался как есть.

У меня естьпопытался удалить декодирование uf8 и посмотрел документацию CPAN для HTML :: Entities.

Ответ:

@ ZyX ответил на исходный вопрос, но, как и другие,Как отмечалось в комментариях, это избыточно, поскольку на самом деле нет необходимости использовать HTML-объекты, если вы обслуживаете страницы с набором символов UTF-8 (как и я, с метатегом -

<meta charset="utf-8">

а также в конфигурации Apache:

AddDefaultCharset utf-8

Действительно, возможно, плохо добавлять их в таких случаях: размер файла больше, а текст запутан, если в любом случае захочется использовать исходный код.

Очень важно, чтобы все редакторы, которые вы используете для создания файлов, записывали их также в UTF-8.

Ответы [ 2 ]

2 голосов
/ 21 мая 2011

Мой ответ был только кодировки символов, которые находятся выше диапазона ASCII. Если вы хотите что-то кодировать как html, вы должны использовать

$text=HTML::Entities::encode_entities($text);

%!perl -MHTML::Entities -MEncode -p -i -e '$_=Encode::decode_utf8($_) unless Encode::is_utf8($_); $_=HTML::Entities::encode_entities($_);'

Я не использовал это в этом ответе, потому что TS запрашивал только кодирование символов Юникода без кодирования <, >, &.

Кстати, вы можете использовать $text=HTML::Entities::encode_entities($text, '<>&"'); для кодирования только действительно небезопасных символов (хотя я думаю, это легко выразить с помощью vimscript:

:let entities={'<': 'lt', '>': 'gt', '&': 'amp', '"': 'quot'}
:execute '%s/['.escape(join(keys(entities), ''), '\-]^').']/\="&".entities[submatch(0)].";"/g'
0 голосов
/ 21 мая 2011
perl -MHTML::Entities -i -e 'print encode_entities shift'

должно работать, не так ли?

...