Кодировка
СОДЕРЖАНИЕ
- ИМЯ
- СИНТАКСИС
- ОПИСАНИЕ
- API кодирования Perl
- Кодирование через PerlIO
- Обработка поврежденных данных
- Определение кодировок
- Флаг UTF8
- UTF-8 против utf8 против UTF8
- СМОТРИТЕ ТАКЖЕ
- СОЗДАТЕЛЬ
- АВТОРСКИЕ ПРАВА
ИМЯ
Encode - кодировки символов в Perl
СИНТАКСИС
use Encode qw(decode encode);
$characters = decode('UTF-8', $octets, Encode::FB_CROAK);
$octets = encode('UTF-8', $characters, Encode::FB_CROAK); Таблица содержания
Encode состоит из набора модулей, подробности которых слишком обширны для одной документации. Данный документ объясняет основные API и общие темы в общих чертах. Для других тем и более подробной информации смотрите документацию этих модулей:
- Encode::Alias - Определения псевдонимов для кодировок
- Encode::Encoding - Базовый класс реализации кодировки
- Encode::Supported - Список поддерживаемых кодировок
- Encode::CN - Кодировки упрощенного китайского языка
- Encode::JP - Кодировки японского языка
- Encode::KR - Кодировки корейского языка
- Encode::TW - Кодировки традиционного китайского языка
ОПИСАНИЕ
Модуль Encode предоставляет интерфейс между строками Perl и остальной частью системы. Строки Perl — это последовательности символов.
Набор символов, которые может представлять Perl, является надмножеством символов, определенных Консорциумом Unicode. На большинстве платформ порядковые значения символа, возвращаемые ord(S), являются кодовой точкой Unicode для этого символа. Исключение составляют платформы, где кодировка по умолчанию представляет собой разновидность EBCDIC, а не надмножество ASCII; см. perlebcdic.
В последнее время данные перемещаются по компьютеру кусками по 8 бит, часто называемыми "байтами", но также известными как "октеты" в документации стандартов. Perl широко используется для обработки данных многих типов: не только строк символов, представляющих человеческие или компьютерные языки, но также "бинарных" данных, представляющих собой представление машинных чисел, пикселей изображения или практически всего.
При обработке "бинарных данных" программист хочет, чтобы Perl обрабатывал "последовательности байтов". Это не проблема для Perl: поскольку байт имеет 256 возможных значений, он легко помещается в гораздо больший "логический символ" Perl.
Этот документ в основном объясняет как. perlunitut и perlunifaq объясняют почему.
ТЕРМИНОЛОГИЯ
символ
Символ в диапазоне 0 .. 2**32-1 (или больше); из чего состоят строки Perl.
байт
Символ в диапазоне 0..255; частный случай символа Perl.
октет
8 бит данных с порядковыми значениями 0..255; термин для байтов, передаваемых в или из контекста, отличного от Perl, например, файл на диске, поток стандартного ввода/вывода, база данных, аргумент командной строки, переменная среды, сокет и т. д.
API кодирования Perl
Основные методы
encode
$octets = encode(ENCODING, STRING[, CHECK]) Кодирует скалярное значение STRING из внутреннего формата Perl в ENCODING и возвращает последовательность октетов. ENCODING может быть либо каноническим именем, либо псевдонимом. Для имен и псевдонимов кодировок см. "Определение псевдонимов". Для CHECK см. "Обработка поврежденных данных".
ПРЕДУПРЕЖДЕНИЕ: входной скаляр STRING может быть изменен на месте в зависимости от значения CHECK. См. "LEAVE_SRC", если вы хотите, чтобы входные данные остались неизменными.
Например, чтобы преобразовать строку из внутреннего формата Perl в ISO-8859-1, также известный как Latin1:
$octets = encode("iso-8859-1", $string); ПРЕДУПРЕЖДЕНИЕ: Когда вы выполняете $octets = encode("UTF-8", $string), тогда $octets может не быть равен $string. Хотя оба содержат одни и те же данные, флаг UTF8 для $octets всегда выключен. При кодировании любого значения флаг UTF8 результата всегда выключен, даже если он содержит полностью допустимую строку UTF-8. См. "Флаг UTF8" ниже.
Если $string — undef, тогда undef возвращается.
str2bytes может использоваться как псевдоним для encode.
decode
$string = decode(ENCODING, OCTETS[, CHECK]) Эта функция возвращает строку, полученную при декодировании скалярного значения OCTETS, предполагая, что это последовательность октетов в ENCODING, во внутренний формат Perl. Как и в encode(), ENCODING может быть либо каноническим именем, либо псевдонимом. Для имен кодировок и псевдонимов см. "Определение псевдонимов"; для CHECK см. "Обработка поврежденных данных".
ПРЕДУПРЕЖДЕНИЕ: входной скаляр OCTETS может быть изменен на месте в зависимости от значения CHECK. См. "LEAVE_SRC", если вы хотите, чтобы входные данные остались неизменными.
Например, чтобы преобразовать данные ISO-8859-1 в строку во внутреннем формате Perl:
$string = decode("iso-8859-1", $octets); ПРЕДУПРЕЖДЕНИЕ: Когда вы выполняете $string = decode("UTF-8", $octets), тогда $string может не быть равен $octets. Хотя оба содержат одни и те же данные, флаг UTF8 для $string включен. См. "Флаг UTF8" ниже.
Если $string — undef, тогда undef возвращается.
bytes2str может использоваться как псевдоним для decode.
find_encoding
[$obj =] find_encoding(ENCODING) Возвращает объект кодировки, соответствующий ENCODING. Возвращает undef если соответствующий ENCODING не найден. Возвращаемый объект выполняет фактическое кодирование или декодирование.
$string = decode($name, $bytes); на самом деле
$string = do {
$obj = find_encoding($name);
croak qq(encoding "$name" not found) unless ref $obj;
$obj->decode($bytes);
}; с дополнительной проверкой ошибок.
Поэтому вы можете сэкономить время, повторно используя этот объект следующим образом;
my $enc = find_encoding("iso-8859-1");
while(<>) {
my $string = $enc->decode($_);
... # now do something with $string;
} Помимо "decode" и "encode", доступны и другие методы. Например, name() возвращает каноническое имя объекта кодировки.
find_encoding("latin1")->name; # iso-8859-1 См. Encode::Encoding для получения подробностей.
find_mime_encoding
[$obj =] find_mime_encoding(MIME_ENCODING) Возвращает объект кодировки, соответствующий MIME_ENCODING. Действует аналогично find_encoding(), но mime_name() возвращаемого объекта должно совпадать с MIME_ENCODING. Таким образом, в отличие от find_encoding(), при поиске объекта не используются канонические имена и псевдонимы.
find_mime_encoding("utf8"); # returns undef because "utf8" is not valid I<MIME_ENCODING>
find_mime_encoding("utf-8"); # returns encode object "utf-8-strict"
find_mime_encoding("UTF-8"); # same as "utf-8" because I<MIME_ENCODING> is case insensitive
find_mime_encoding("utf-8-strict"); returns undef because "utf-8-strict" is not valid I<MIME_ENCODING> from_to
[$length =] from_to($octets, FROM_ENC, TO_ENC [, CHECK]) Преобразует данные на месте между двумя кодировками. Данные в $octets должны быть закодированы как октеты, а не как символы во внутреннем формате Perl. Например, чтобы преобразовать данные ISO-8859-1 в кодировку Microsoft CP1250:
from_to($octets, "iso-8859-1", "cp1250"); и чтобы преобразовать их обратно:
from_to($octets, "cp1250", "iso-8859-1"); Поскольку преобразование происходит на месте, преобразуемые данные не могут быть константой строки: это должна быть скалярная переменная.
from_to() возвращает длину преобразованной строки в октетах при успехе и undef при ошибке.
ПРЕДУПРЕЖДЕНИЕ: следующие операции могут выглядеть одинаково, но таковыми не являются:
from_to($data, "iso-8859-1", "UTF-8"); #1
$data = decode("iso-8859-1", $data); #2 И #1, и #2 делают $data строкой, полностью соответствующей UTF-8, но только #2 включает флаг UTF8. #1 эквивалентно:
$data = encode("UTF-8", decode("iso-8859-1", $data)); См. "Флаг UTF8" ниже.
Также обратите внимание, что:
from_to($octets, $from, $to, $check); эквивалентно:
$octets = encode($to, decode($from, $octets), $check); Да, он не учитывает $check при декодировании. Это сделано намеренно. Если вам нужна точная настройка, используйте decode и затем encode следующим образом:
$octets = encode($to, decode($from, $octets, $check_from), $check_to); encode_utf8
$octets = encode_utf8($string); Эквивалентно $octets = encode("utf8", $string). Символы в $string закодированы в внутреннем формате Perl, и результат возвращается в виде последовательности октетов. Поскольку все возможные символы в Perl имеют (свободное, а не строгое) представление в utf8, эта функция не может завершиться ошибкой.
ПРЕДУПРЕЖДЕНИЕ: не используйте эту функцию для обмена данными, так как она может генерировать нестрогое utf8 $octets! Для строго корректного вывода UTF-8 используйте $octets = encode("UTF-8", $string).
decode_utf8
$string = decode_utf8($octets [, CHECK]); Эквивалентно $string = decode("utf8", $octets [, CHECK]). Последовательность октетов, представленная $octets, декодируется из (свободного, а не строгого) utf8 в последовательность логических символов. Поскольку не все последовательности октетов являются корректными нестрогими utf8, вполне возможно, что эта функция завершится ошибкой. Для проверки см. "Обработка некорректных данных".
ПРЕДУПРЕЖДЕНИЕ: не используйте эту функцию для обмена данными, так как она может создать $string с нестрогим представлением utf8! Для строго корректного представления $string в UTF-8 используйте $string = decode("UTF-8", $octets [, CHECK]).
ПРЕДУПРЕЖДЕНИЕ: входные данные $octets могут быть изменены на месте в зависимости от того, что установлено в CHECK. См. "LEAVE_SRC", если вы хотите, чтобы ваши входные данные остались неизменными.
Список доступных кодировок
use Encode;
@list = Encode->encodings(); Возвращает список канонических имён доступных кодировок, которые уже были загружены. Чтобы получить список всех доступных кодировок, включая те, которые ещё не загружены, используйте:
@all_encodings = Encode->encodings(":all"); Или вы можете указать имя конкретного модуля:
@with_jp = Encode->encodings("Encode::JP"); Когда "::" не указано в имени, используется "Encode::".
@ebcdic = Encode->encodings("EBCDIC"); Чтобы подробно узнать о поддерживаемых кодировках, см. Encode::Supported.
Определение псевдонимов
Чтобы добавить новый псевдоним к заданной кодировке, используйте:
use Encode;
use Encode::Alias;
define_alias(NEWNAME => ENCODING); После этого NEWNAME может использоваться как псевдоним для ENCODING. ENCODING может быть именем кодировки или объектом кодировки.
Прежде чем делать это, убедитесь, что псевдоним не существует, используя resolve_alias(), которая возвращает каноническое имя. Например:
Encode::resolve_alias("latin1") eq "iso-8859-1" # true
Encode::resolve_alias("iso-8859-12") # false; nonexistent
Encode::resolve_alias($name) eq $name # true if $name is canonical resolve_alias() не требует use Encode::Alias; его можно импортировать через use Encode qw(resolve_alias).
Подробности см. в Encode::Alias.
Поиск имён регистра наборов символов IANA
Каноническое имя заданной кодировки необязательно совпадает с регистром наборов символов IANA, обычно обозначаемым как Content-Type: text/plain; charset=WHATEVER. В большинстве случаев каноническое имя работает, но иногда нет, особенно в случае "utf-8-strict".
Начиная с версии Encode 2.21, поэтому была добавлена новая функция mime_name().
use Encode;
my $enc = find_encoding("UTF-8");
warn $enc->name; # utf-8-strict
warn $enc->mime_name; # UTF-8 См. также: Encode::Encoding
Кодирование через PerlIO
Если ваш Perl поддерживает PerlIO (что является стандартным), вы можете использовать слой PerlIO для декодирования и кодирования непосредственно через файловый дескриптор. Следующие два примера полностью идентичны по функциональности:
### Version 1 via PerlIO
open(INPUT, "< :encoding(shiftjis)", $infile)
|| die "Can't open < $infile for reading: $!";
open(OUTPUT, "> :encoding(euc-jp)", $outfile)
|| die "Can't open > $output for writing: $!";
while (<INPUT>) { # auto decodes $_
print OUTPUT; # auto encodes $_
}
close(INPUT) || die "can't close $infile: $!";
close(OUTPUT) || die "can't close $outfile: $!";
### Version 2 via from_to()
open(INPUT, "< :raw", $infile)
|| die "Can't open < $infile for reading: $!";
open(OUTPUT, "> :raw", $outfile)
|| die "Can't open > $output for writing: $!";
while (<INPUT>) {
from_to($_, "shiftjis", "euc-jp", 1); # switch encoding
print OUTPUT; # emit raw (but properly encoded) data
}
close(INPUT) || die "can't close $infile: $!";
close(OUTPUT) || die "can't close $outfile: $!"; В первом варианте вы позволяете соответствующему слою кодировки обрабатывать преобразование. Во втором — явно преобразуете из одной кодировки в другую.
К сожалению, возможно, что кодировки не являются PerlIO-ориентированными. Вы можете проверить, поддерживается ли ваша кодировка PerlIO путём вызова метода perlio_ok на ней:
Encode::perlio_ok("hz"); # false
find_encoding("euc-cn")->perlio_ok; # true wherever PerlIO is available
use Encode qw(perlio_ok); # imported upon request
perlio_ok("euc-jp") К счастью, все кодировки, поставляемые с ядром Encode являются PerlIO-ориентированными, за исключением hz и ISO-2022-kr. Для подробностей см. Encode::Encoding и Encode::PerlIO.
Обработка некорректных данных
Необязательный аргумент CHECK указывает Encode что делать при обнаружении некорректных данных. Без CHECK предполагается Encode::FB_DEFAULT (== 0).
Начиная с версии 2.12, Encode поддерживает значения coderef для CHECK; см. ниже.
ПРИМЕЧАНИЕ: не все кодировки поддерживают эту функцию. Некоторые кодировки игнорируют аргумент CHECK. Например, Encode::Unicode игнорирует CHECK и всегда завершает выполнение с ошибкой.
Список значений CHECK
FB_DEFAULT
I<CHECK> = Encode::FB_DEFAULT ( == 0) Если CHECK равен 0, кодирование и декодирование заменяют любой некорректный символ на символ подстановки. При кодировании используется SUBCHAR. При декодировании используется универсальный символ ЗАМЕНЫ, код U+FFFD. Если предполагается, что данные имеют кодировку UTF-8, выдается необязательное лексическое предупреждение категории "utf8".
FB_CROAK
I<CHECK> = Encode::FB_CROAK ( == 1) Если CHECK равен 1, методы немедленно завершают работу с сообщением об ошибке. Поэтому, когда CHECK равен 1, следует перехватывать исключения с помощью eval{}, если вы не хотите, чтобы оно die.
FB_QUIET
I<CHECK> = Encode::FB_QUIET Если CHECK установлен в Encode::FB_QUIET, кодирование и декодирование немедленно возвращают обработанную до этого часть данных при возникновении ошибки. Аргумент data перезаписывается всем, что идёт после этого; то есть, необработанной частью данных. Это удобно, когда вам нужно многократно вызывать decode в случае, если ваши исходные данные могут содержать частичные многобайтовые последовательности символов (то есть, вы читаете с буфером фиксированной ширины). Вот пример кода, который делает именно это:
my($buffer, $string) = ("", "");
while (read($fh, $buffer, 256, length($buffer))) {
$string .= decode($encoding, $buffer, Encode::FB_QUIET);
# $buffer now contains the unprocessed partial character
} FB_WARN
I<CHECK> = Encode::FB_WARN Это то же самое, что и FB_QUIET выше, за исключением того, что вместо безмолвия при ошибках, выводится предупреждение. Это удобно для отладки.
FB_PERLQQ FB_HTMLCREF FB_XMLCREF
- Режим perlqq (CHECK = Encode::FB_PERLQQ)
- Режим ссылок HTML (CHECK = Encode::FB_HTMLCREF)
- Режим ссылок XML (CHECK = Encode::FB_XMLCREF)
Для кодировок, реализованных модулем Encode::XS, CHECK == Encode::FB_PERLQQ переводит encode и decode в режим резервного копирования perlqq.
При декодировании для некорректного символа вставляется \xHH, где HH — шестнадцатеричное представление октета, который не мог быть декодирован в utf8. При кодировании вставляется \x{HHHH}, где HHHH — число Unicode (в любом количестве шестнадцатеричных цифр) символа, который не найден в наборе символов кодировки.
Режимы ссылок HTML/XML аналогичны. Вместо \x{HHHH}, HTML использует &#NNN;, где NNN — десятичное число, а XML использует &#xHHHH;, где HHHH — шестнадцатеричное число.
В версии Encode 2.10 или более поздней также подразумевается LEAVE_SRC.
Маска битов
Все эти режимы фактически устанавливаются с помощью маски битов. Вот как расположены константы FB_XXX . Вы можете импортировать константы FB_XXX через use Encode qw(:fallbacks), а универсальные константы маски битов — через use Encode qw(:fallback_all).
FB_DEFAULT FB_CROAK FB_QUIET FB_WARN FB_PERLQQ
DIE_ON_ERR 0x0001 X
WARN_ON_ERR 0x0002 X
RETURN_ON_ERR 0x0004 X X
LEAVE_SRC 0x0008 X
PERLQQ 0x0100 X
HTMLCREF 0x0200
XMLCREF 0x0400 LEAVE_SRC
Encode::LEAVE_SRC Если бит Encode::LEAVE_SRC не установлен, но CHECK установлен, то исходная строка для encode() или decode() будет перезаписана на месте. Если вас это не интересует, то выполните побитовое ИЛИ с маской.
coderef для CHECK
Начиная с версии Encode 2.12, CHECK также может быть ссылкой на код, принимающий порядковое значение неотображённого символа в качестве аргумента и возвращающий октеты, представляющие символ подстановки. Например:
$ascii = encode("ascii", $utf8, sub{ sprintf "<U+%04X>", shift }); Действует как FB_PERLQQ , но вместо \x{XXXX} используется U+XXXX.
Функция подстановки для decode должна возвращать закодированную строку (последовательность символов) и принимать список порядковых значений в качестве аргументов. Таким образом, если вы хотите декодировать октеты как UTF-8 и использовать ISO-8859-15 в качестве резервного варианта для байтов, которые не являются допустимыми UTF-8, вы можете написать:
$str = decode 'UTF-8', $octets, sub {
my $tmp = join '', map chr, @_;
return decode 'ISO-8859-15', $tmp;
}; Определение кодировок
Чтобы определить новую кодировку, используйте:
use Encode qw(define_encoding);
define_encoding($object, CANONICAL_NAME [, alias...]); CANONICAL_NAME будет ассоциирован с $object. Объект должен предоставлять интерфейс, описанный в Encode::Encoding. Если предоставлено более двух аргументов, дополнительные аргументы рассматриваются как псевдонимы для $object.
Подробности см. в Encode::Encoding.
Флаг UTF8
До появления поддержки Unicode в Perl оператор eq просто сравнивал строки, представленные двумя скалярами. Начиная с Perl 5.8, eq сравнивает две строки с одновременным учётом флага UTF8. Чтобы объяснить, почему мы это сделали, я процитирую страницу 402 из Programming Perl, 3-е изд.
- Цель #1:
-
Старые программы, ориентированные на байты, не должны спонтанно ломаться на старых данных, ориентированных на байты.
- Цель #2:
-
Старые программы, ориентированные на байты, должны волшебным образом начать работать с новыми данными, ориентированными на символы, при необходимости.
- Цель #3:
-
Программы должны работать так же быстро в новом режиме, ориентированном на символы, как и в старом режиме, ориентированном на байты.
- Цель #4:
-
Perl должен оставаться одним языком, а не разделять его на ориентированный на байты Perl и ориентированный на символы Perl.
Когда Programming Perl, 3-е изд. был написан, даже Perl 5.6.0 ещё не существовал, многие функции, описанные в книге, долгое время оставались нереализованными. Perl 5.8 исправил многое из этого, и введение флага UTF8 является одним из них. Можно представить две совершенно разные категории строк и операций со строками в Perl: одна — ориентированная на байты, когда внутренний флаг UTF8 выключен, и другая — ориентированная на символы, когда внутренний флаг UTF8 включен.
Этот флаг UTF8 не отображается в скриптах Perl, точно так же, как вы не можете (или не обязаны) видеть, содержит ли скаляр строку, целое число или число с плавающей точкой. Но вы все равно можете заглянуть внутрь и поработать с этими данными, если захотите. См. следующий раздел.
Работа с внутренним представлением Perl
Следующий API использует части внутреннего представления Perl в текущей реализации. Таким образом, они эффективны, но могут измениться в будущих версиях.
is_utf8
is_utf8(STRING [, CHECK]) [ВНУТРЕННЕЕ] Проверяет, включён ли флаг UTF8 в строке STRING. Если CHECK имеет значение true, также проверяет, содержит ли STRING корректный UTF-8. Возвращает true при успехе, false в противном случае.
Обычно необходимо только для отладки и тестирования. Не используйте этот флаг в качестве маркера для различения символьных и бинарных данных, это должно быть решено для каждой переменной при написании кода.
ПРЕДУПРЕЖДЕНИЕ: Если у STRING установлен флаг UTF8, это НЕ означает, что STRING закодирован в UTF-8, и наоборот.
Начиная с Perl 5.8.1, utf8 также имеет функцию utf8::is_utf8.
_utf8_on
_utf8_on(STRING) [ВНУТРЕННЕЕ] Включает внутренний флаг UTF8 строки STRING. Строка STRING не проверяется на содержание только корректного UTF-8. Не используйте эту функцию, если не уверены на все 100%, что STRING содержит только корректный UTF-8. Возвращает предыдущее состояние флага UTF8 (пожалуйста, не интерпретируйте возвращаемое значение как индикатор успеха или неудачи), или undef, если STRING не является строкой.
ПРИМЕЧАНИЕ: По соображениям безопасности, эта функция не работает с затронутыми значениями.
_utf8_off
_utf8_off(STRING) [ВНУТРЕННЕЕ] Отключает внутренний флаг UTF8 строки STRING. Не используйте без необходимости. Возвращает предыдущее состояние флага UTF8, или undef, если STRING не является строкой. Не интерпретируйте возвращаемое значение как индикатор успеха или неудачи, так как это не его значение: это только предыдущее значение.
ПРИМЕЧАНИЕ: По соображениям безопасности, эта функция не работает с затронутыми значениями.
UTF-8 vs. utf8 vs. UTF8
....We now view strings not as sequences of bytes, but as sequences
of numbers in the range 0 .. 2**32-1 (or in the case of 64-bit
computers, 0 .. 2**64-1) -- Programming Perl, 3rd ed. Исторически это было понятие UTF-8 в Perl, так как именно так UTF-8 был первоначально задуман Кентом Томпсоном при его изобретении. Однако, благодаря последующим изменениям соответствующих стандартов, официальный UTF-8 теперь более строгий. Например, его диапазон намного уже (0 .. 0x10_FFFF для покрытия только 21 бита вместо 32 или 64 бит), и некоторые последовательности запрещены, такие как те, которые используются в парах суррогатов, 31 код без символов 0xFDD0 .. 0xFDEF, последние два кода в любом плане (0xXX_FFFE и 0xXX_FFFF), все не самые короткие кодировки и т. д.
Прежнее значение по умолчанию, когда Perl всегда использовал свободную интерпретацию UTF-8, было отменено:
From: Larry Wall <larry@wall.org>
Date: December 04, 2004 11:51:58 JST
To: perl-unicode@perl.org
Subject: Re: Make Encode.pm support the real UTF-8
Message-Id: <20041204025158.GA28754@wall.org>
On Fri, Dec 03, 2004 at 10:12:12PM +0000, Tim Bunce wrote:
: I've no problem with 'utf8' being perl's unrestricted uft8 encoding,
: but "UTF-8" is the name of the standard and should give the
: corresponding behaviour.
For what it's worth, that's how I've always kept them straight in my
head.
Also for what it's worth, Perl 6 will mostly default to strict but
make it easy to switch back to lax.
Larry Понятно? Начиная с Perl 5.8.7, «UTF-8» означает UTF-8 в его современном понимании, которое консервативное, строгое и учитывает безопасность, в то время как «utf8» означает UTF-8 в его прежнем понимании, которое было свободным, небрежным и беззаботным. Encode версия 2.10 или выше поэтому понимает эту тонкую, но крайне важную разницу между "UTF-8" и "utf8".
encode("utf8", "\x{FFFF_FFFF}", 1); # okay
encode("UTF-8", "\x{FFFF_FFFF}", 1); # croaks В модуле Encode, "UTF-8" фактически является каноническим именем для "utf-8-strict". Тот дефис между "UTF" и "8" важен; без него Encode становится «свободным» и (возможно, чрезмерно) допускающим:
find_encoding("UTF-8")->name # is 'utf-8-strict'
find_encoding("utf-8")->name # ditto. names are case insensitive
find_encoding("utf_8")->name # ditto. "_" are treated as "-"
find_encoding("UTF8")->name # is 'utf8'. Внутренний флаг UTF8 в Perl называется «UTF8», без дефиса. Он указывает, закодирована ли строка внутри как «utf8», также без дефиса.
СПРАВКА
Encode::Encoding, Encode::Supported, Encode::PerlIO, encoding, perlebcdic, "open" в perlfunc, perlunicode, perluniintro, perlunifaq, perlunitut, utf8, список рассылки Perl Unicode http://lists.perl.org/list/perl-unicode.html
СОЗДАТЕЛЬ
Данный проект был инициирован покойным Ником Инг-Симмонсом и впоследствии поддерживался Даном Когаем <dankogai@cpan.org>. Полный список участников см. в файле AUTHORS. Для любых вопросов отправляйте письмо по адресу <perl-unicode@perl.org>, чтобы мы могли все поделиться.
Хотя Дану Когаи принадлежит авторское право в качестве хранителя, заслуга должна принадлежать всем участникам. Список тех, кто предоставил код в проект, см. в файле AUTHORS.
АВТОРСКИЕ ПРАВА
Авторские права 2002-2014 Дан Когаи <dankogai@cpan.org>.
Эта библиотека является свободно распространяемым программным обеспечением; вы можете распространять и/или модифицировать ее в соответствии с условиями Perl.
© 1993–2020 Larry Wall and others
Licensed under the GNU General Public License version 1 or later, or the Artistic License.
The Perl logo is a trademark of the Perl Foundation.
https://perldoc.perl.org/5.28.3/Encode