Как мне кодировать символы в числовой символьный формат в Perl? - PullRequest
0 голосов
/ 20 января 2011

Я нашел этот пример сценария из Как я могу угадать кодировку строки в Perl?

#!C:\perl\bin
use utf8;
use Encode qw(encode PERLQQ XMLCREF);
my $string = 'This year I went to 北京 Perl workshop.';
#print encode('ascii', $string, PERLQQ);
# This year I went to \x{5317}\x{4eac} Perl workshop.
print encode('ascii', $string, XMLCREF); # This year I went to 北京 Perl workshop.

После теста я обнаружил, что закодированный выходной результат:

This year I went to \x{71fa9} Perl workshop.
This year I went to 񱾩 Perl workshop.

Похоже, что результат отличается от того, что автор показывает нам выше в примере кода.

Интересно, как я могу кодировать строку символов и выводить ее в формате числовой символьной ссылки (&#xHHHH;), например, когда:

my $string = 'This year I went to 北京 Perl workshop.';

закодированный вывод будет:

This year I went to 北京 Perl workshop.

Ответы [ 2 ]

1 голос
/ 21 января 2011

Я - автор ответа, связанного в вопросе.


Вы допустили простую ошибку, вы сохранили программу Perl в GB18030.Если он содержит use utf8;, вы должны сохранить его в формате UTF-8 .

0 голосов
/ 21 января 2011
$string =~ s/[^\0-\377]/ sprintf '&#x%04x;', ord($&) /ge

Найдите каждый символ в $string не в диапазоне 0-255 (т. Е. Любые широкие символы) и замените его значением выражения sprintf '&#x%04x;', ord($&), где $& - это широкий символ, которыйбыло подобрано.

use utf8;
$string = "This year I went to \x{5317}\x{4eac} Perl workshop.";
$string =~ s/[^\0-\377]/ sprintf '&#x%04x;', ord($&) /ge;
print $string;

Производит:

This year I went to 北京 Perl workshop.
...