2016-01-26 2 views
0

Я новичок в процедуре HTML :: Entities от Perl decode_entities() до конвертирует заголовки, очищенные от веб-сайтов новостей.Неожиданное поведение HTML :: Entities

Вот хороший результат:

Перед: Texas grand jury clears Planned Parenthood, indicts its accusers
После: Texas grand jury clears Planned Parenthood, indicts its accusers

Но вот загадочное результат:

Перед: Big changes could be coming to Utah’s criminal justice system
После: Big changes could be coming to Utahâs criminal justice system

Обратите внимание, что не только код ’ не преобразован к одной цитате,   не был декодирован в пространство, в отличие от первого примера.

Что происходит?

ответ

2

Разница между вашим первым и вторым примером заключается в том, что первая не содержит кодовых пунктов выше 255, а вторая -. Таким образом, первая строка может отображаться в соответствии с собственным 8-битным набором символов вашей системы (скорее всего, ISO 8859-1/Latin 1), но вторая не может. Причина этого, согласно perlunicode, заключается в том, что «использование кодовой точки выше 255 подразумевает Unicode для всей строки».

Поскольку теперь у вас есть символы Unicode в вашей строке, вам нужно правильно закодировать текст для вывода, иначе вы увидите «странные символы» (как и те, что приведены в вашем примере!). Так как вы не указали Minimal, Complete, and Verifiable example, я не уверен, каков ваш метод вывода, но давайте просто предположим, что STDOUT облегчит вам задачу. Есть несколько различных способов, чтобы закодировать текст в поток октетов:

  1. вручную с помощью Encode модуля
  2. автоматически, используя правильный слой I/O

Я предпочитаю второй вариант потому что это менее утомительно. Чтобы сделать это, мы просто называем binmode() на STDOUT:

use strict; 
use warnings; 
use HTML::Entities; 

my $str = 'Big changes could be coming to Utah’s criminal justice system'; 
my $decoded = decode_entities($str); 

binmode(STDOUT, ':encoding(UTF-8)'); 
printf("%s\n%vx\n", $decoded, $decoded); 

Выход:

$ perl foo.pl 
Big changes could be coming to Utah’s criminal justice system 
42.69.67.20.63.68.61.6e.67.65.73.20.63.6f.75.6c.64.20.62.65.20.63.6f.6d.69.6e.67.20.74.6f.20.55.74.61.68.2019.73.20.63.72.69.6d.69.6e.61.6c.20.6a.75.73.74.69.63.65.a0.73.79.73.74.65.6d 

Вы можете видеть, что есть точка 2019 (right single quotation mark) код между символами 68 и 73 (ч и с, соответственно), а также a0 (non-breaking space) между 65 и 73, что будет e и s.

В дополнение к вышеупомянутым perlunicode ссылке, вы должны прочитать perluniintro, perlunitut (короткий!), И perlunifaq, если вы заинтересованы в получении дополнительной информации о том, как Perl обрабатывает Unicode и символов кодировки в целом.

Смежные вопросы