Разница между вашим первым и вторым примером заключается в том, что первая не содержит кодовых пунктов выше 255, а вторая -. Таким образом, первая строка может отображаться в соответствии с собственным 8-битным набором символов вашей системы (скорее всего, ISO 8859-1/Latin 1), но вторая не может. Причина этого, согласно perlunicode, заключается в том, что «использование кодовой точки выше 255 подразумевает Unicode для всей строки».
Поскольку теперь у вас есть символы Unicode в вашей строке, вам нужно правильно закодировать текст для вывода, иначе вы увидите «странные символы» (как и те, что приведены в вашем примере!). Так как вы не указали Minimal, Complete, and Verifiable example, я не уверен, каков ваш метод вывода, но давайте просто предположим, что STDOUT
облегчит вам задачу. Есть несколько различных способов, чтобы закодировать текст в поток октетов:
- вручную с помощью Encode модуля
- автоматически, используя правильный слой 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 и символов кодировки в целом.