Ответ зависит от того, как вы хотите использовать заголовок. Есть 3 основных способа:
- Байты, представляющие строку в кодировке UTF-8.
Это формат, который следует использовать, если вы хотите хранить строку в кодировке UTF-8 вне вашего приложения, будь то на диске или при отправке по сети или что-либо за пределами вашей программы.
Концепция символов является внутренней для Perl. Когда вы выполняете Encode::decode_utf8
, то попытка преобразования байта в строку символов выполняется, как это видно из Perl. Виртуальная машина Perl (и программист, пишущий Perl-код) не могут реализовать эту концепцию, кроме как путем декодирования байтов UTF-8 на входе и кодирования их в байты UTF-8 на выходе. Например, ваша программа получает два байта в качестве входных данных, которые, как вы знаете, представляют символ (ы) в кодировке UTF-8, скажем, 0xC3 0xB6
. В этом случае decode_utf8
возвращает представление, которое вместо двух байтов видит один символ: ö
.
Затем вы можете приступить к манипулированию этой строкой в Perl. Чтобы проиллюстрировать разницу, рассмотрим следующий код:
my $bytes = "\xC3\xB6";
say length($bytes); # prints "2"
my $string = decode_utf8($bytes);
say length($string); # prints "1"
Особый случай ASCII, подмножество UTF-8.
ASCII - это очень небольшое подмножество Unicode, где символы в этом диапазоне представлены одним байтом. Преобразование Unicode в ASCII является операцией с потерями, поскольку большинство символов Unicode не являются символами ASCII. Вы либо вынуждены отбросить каждый символ в вашей строке, которого нет в ASCII, либо попытаться отобразить символ Unicode в его ближайший эквивалент ASCII (что невозможно в подавляющем большинстве случаев), когда пытаетесь привести Unicode строка в ASCII.
Поскольку у вас есть предупреждения о широких символах, это означает, что вы пытаетесь манипулировать (возможно, выводить) символами Unicode, которые не могут быть представлены как ASCII или ISO-8859-1.
Если вам не нужно манипулировать заголовком из вашего XML-документа в виде строки, я бы рекомендовал оставить его в виде байтов UTF-8 (я бы сказал, что вам следует соблюдать осторожность, чтобы не смешивать байты и символы в строках ). Если вам нужно манипулировать им, то декодируйте, манипулируйте и на выходе кодируйте его в UTF-8.
Для дальнейшего чтения используйте perldoc
для изучения perlunitut
, perlunifaq
, perlunicode
, perluniintro
и Encode
.