use utf8
только подсказка интерпретатору / компилятору perl, что ваш файл имеет кодировку UTF-8.Если у вас есть строки с установленным старшим битом, он автоматически закодирует их в Unicode.
Если у вас есть переменная, которая закодирована в iso-8859-1, вы должны ее декодировать.Тогда ваша переменная находится во внутреннем формате Unicode.Это utf8, но вам не важно, какой perl для кодирования использует внутренне.
Теперь, если вы хотите напечатать такую строку, вам нужно преобразовать строку в юникоде обратно в строку байтов.Вам нужно сделать encode
для этой строки.Если вы не делаете кодирование вручную, perl
само закодирует его обратно в iso-8859-1.Это кодировка по умолчанию.
Прежде чем печатать переменную $ x, вам нужно сделать $x = encode('UTF-8', $x)
для нее.
Для правильной обработки UTF-8 вам всегда нужно декодировать () каждый внешний вход через I / O.И вам всегда нужно кодировать () все, что выходит из вашей программы.
Чтобы изменить кодировку ввода / вывода по умолчанию, вы можете использовать что-то вроде этого.
use utf8;
use open ':encoding(UTF-8)';
use open ':std';
Первая строка говорит, что вашаИсходный код закодирован в utf8.Вторая строка говорит, что каждый вход / выход должен автоматически кодироваться в utf8.Важно отметить, что open()
также открывает файл в режиме utf8.Если вы работаете с двоичными файлами, вам нужно вызвать binmode()
на дескрипторе.
Но вторая строка не меняет обработку STDIN, STDOUT или STDERR.Третья строка изменит это.
Вы, вероятно, можете использовать модуль utf8: all , который облегчает этот процесс.Но всегда хорошо понимать, как все это работает за кадром.
Чтобы исправить ваш пример.Один из возможных способов заключается в следующем:
#!/usr/bin/env perl
use Date::Holidays::DK;
use Encode;
use Devel::Peek;
my $x = decode("iso-8859-1",
is_dk_holiday(2011,1,1)
);
Dump($x);
print encode("UTF-8", "January 1st is '$x'\n");