2011-01-20 5 views
0

Я нашел этот пример сценария из How can I guess the encoding of a string in Perl?Как кодировать символы в числовом символьном формате в 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. 

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

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

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

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

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

мой тестовый результат выглядит следующим образом. В этом году я пошел в & # x71fa9; Перл. – user583552

ответ

0
$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. 
1

Я являюсь автором ответа, связанного с вопросом.


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

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