Кодирование
СОДЕРЖАНИЕ
- НАЗВАНИЕ
- СИНТАКСИС
- ОПИСАНИЕ
- 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 обрабатывал "последовательности байтов". Это не проблема для 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 в кодировку CP1250 Microsoft:
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! Для строго валидного представления UTF-8 $string используйте $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 выше, за исключением того, что вместо молчания об ошибках он выдаёт предупреждение. Это удобно для отладки.
ПРЕДУПРЕЖДЕНИЕ: Все предупреждения модуля Encode сообщаются независимо от настроек pragma warnings. Если вы хотите следовать настройкам лексических предупреждений, настроенных с помощью pragma warnings, добавьте также значение проверки ENCODE::ONLY_PRAGMA_WARNINGS. Это значение доступно начиная с версии Encode 2.99.
FB_PERLQQ FB_HTMLCREF FB_XMLCREF
- Режим perlqq (CHECK = Encode::FB_PERLQQ)
- Режим HTML charref (CHECK = Encode::FB_HTMLCREF)
- Режим XML charref (CHECK = Encode::FB_XMLCREF)
Для кодировок, реализованных модулем Encode::XS, CHECK == Encode::FB_PERLQQ устанавливает encode и decode в режим обратного вызова perlqq.
При декодировании вставляется \xHH, где HH — шестнадцатеричное представление октета, который не смог быть декодирован в utf8. При кодировании вставляется \x{HHHH}, где HHHH — код Unicode (в любом количестве шестнадцатеричных цифр) символа, которого нет в наборе символов кодировки.
Режимы HTML/XML character reference почти одинаковы. Вместо \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, 3rd ed.
- Цель #1:
-
Старые программы, ориентированные на байты, не должны самопроизвольно ломаться при работе со старыми данными, ориентированными на байты.
- Цель #2:
-
Старые программы, ориентированные на байты, должны магически начать работать с новыми данными, ориентированными на символы, при необходимости.
- Цель #3:
-
Программы должны работать так же быстро в новом режиме, ориентированном на символы, как и в старом режиме, ориентированном на байты.
- Цель #4:
-
Perl должен оставаться одним языком, а не разделяться на Perl, ориентированный на байты, и Perl, ориентированный на символы.
Когда Programming Perl, 3rd ed. был написан, даже 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 истинно, также проверяет, содержит ли 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 кодирования. Не используйте эту функцию, если вы абсолютно уверены, что STRING содержит только корректную UTF-8 кодировку. Возвращает предыдущее состояние флага UTF8 (поэтому не интерпретируйте возвращаемое значение как индикатор успеха или неудачи), или undef если STRING не является строкой.
ПРИМЕЧАНИЕ: По соображениям безопасности, эта функция не работает с помеченными значениями.
_utf8_off
_utf8_off(STRING) [ВНУТРЕННЕЕ] Выключает внутренний флаг UTF8 для STRING. Не используйте без необходимости. Возвращает предыдущее состояние флага UTF8, или undef если STRING не является строкой. Не интерпретируйте возвращаемое значение как указание на успех или неудачу, так как это не его смысл: оно только указывает на предыдущее значение.
ПРИМЕЧАНИЕ: По соображениям безопасности, эта функция не работает с помеченными значениями.
UTF-8 против utf8 против 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. Исторически в Perl существовало понятие UTF-8, так как именно так 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–2021 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.34.0/Encode