tarfile — Чтение и запись файлов tar архива¶
Исходный код: Lib/tarfile.py
Модуль tarfile позволяет читать и записывать архивы tar, в том числе с
использованием сжатия gzip, bz2 и lzma. Используйте модуль zipfile для
чтения или записи файлов .zip или функций более высокого уровня в
shutil.
Некоторые факты и цифры:
- считывает и записывает
gzip,bz2иlzmaсжатые архивы, если доступны соответствующие модули. - поддержка чтения/записи для формата POSIX.1-1988 (ustar).
- поддержка чтения/записи для формата GNU tar, включая расширения longname и longlink, поддержка только для чтения для всех вариантов расширения sparse, включая восстановление разреженных файлов.
- поддержка чтения/записи для формата POSIX.1-2001 (pax).
- обрабатывает каталоги, обычные файлы, жесткие ссылки, символьные ссылки, fifos, символ устройства и блочные устройства и может получать и восстанавливать информацию о файлах, такую как метка времени, разрешения доступа и владелец.
Изменено в версии 3.3: Добавлена поддержка сжатия lzma.
-
tarfile.open(name=None, mode='r', fileobj=None, bufsize=10240, **kwargs)¶ Возвращает объект
TarFileдля имени пути name. Подробные сведения об объектахTarFileи разрешенных аргументах ключевой см. в разделе Объекты TarFile.mode должен быть строкой формы
'filemode[:compression]', по умолчанию используется'r'. Вот полный список комбинаций режимов:режим действие 'r' или 'r:*'Открыть для чтения с прозрачным сжатием (рекомендуется). 'r:'Открыть для чтения исключительно без сжатия. 'r:gz'Открыть для чтения со сжатием gzip. 'r:bz2'Открыть для чтения со сжатием bzip2. 'r:xz'Открыт для чтения со сжатием lzma. 'x'или'x:'Создайть файл tarfile исключительно без сжатия. Создать исключение FileExistsError, если оно уже существует.'x:gz'Создать tar файл с gzip сжатием. Поднять исключение FileExistsError, если он уже существует.'x:bz2'Создать tar файл с bzip2 сжатием. Поднять исключение FileExistsError, если он уже существует.'x:xz'Создать tar файл с lzma сжатием. Поднять исключение FileExistsError, если он уже существует.'a' or 'a:'Открыть для добавления без сжатия. Файл создается, если он не существует. 'w' or 'w:'Открыть для несжатой записи. 'w:gz'Открыть для gzip сжатой записи. 'w:bz2'Открыть для записи со сжатием bzip2. 'w:xz'Открыт для записи со сжатием lzma. Обратите внимание, что
'a:gz','a:bz2'или'a:xz'невозможны. Если mode не подходит для открытия определенного (сжатого) файла для чтения,ReadErrorподнимается. Используйте mode'r', чтобы избежать этого. Если метод сжатия не поддерживается,CompressionErrorподнимается.Если fileobj указан, он используемый в качестве альтернативы объекта файла, открытому в двоичном режиме для name. Предполагается, что она находится в положении 0.
Для режимов
'w:gz','r:gz','w:bz2','r:bz2','x:gz','x:bz2',tarfile.open()принимает аргумент ключевой compresslevel (9по умолчанию) для указания уровня сжатия файла.Для специальных целей существует второй формат mode:
'filemode|[compression]'.tarfile.open()будет возвращает объектTarFile, который обрабатывает свои данные как поток блоков. Случайный поиск не будет выполнен в файле. Если указано, fileobj может быть любой объект, имеющий методread()илиwrite()(в зависимости от mode). bufsize указывает размер блока и по умолчанию составляет20 * 512байт. Используйте этот вариант в сочетании, например, сsys.stdin, сокет файлового объекта или ленточным устройством. Однако такой объектTarFileограничен тем, что не допускает произвольного доступа, см. Примеры. Возможные в настоящее время режимы:Режим Действие 'r|*'Открыть stream tar блоков для чтения с прозрачным сжатием. 'r|'Открыть stream несжатых tar блоков для чтения. 'r|gz'Открыть сжатый stream gzip для чтения. 'r|bz2'Открыть сжатый stream bzip2 для чтения. 'r|xz'Открыть сжатый stream lzma для чтения. 'w|'Открыть несжатый stream для записи. 'w|gz'Открыть сжатый stream gzip для записи. 'w|bz2'Открыть сжатый stream bzip2 для записи. 'w|xz'Открыть сжатый stream lzma для записи. Изменено в версии 3.5: Добавлен режим
'x'(исключительного создания).Изменено в версии 3.6: Параметр name принимает путеподобный объект.
-
class
tarfile.TarFile Класс для чтения и записи архивов tar. Не используйте этот класс напрямую: используйте
tarfile.open(). См. Объекты TarFile.
-
tarfile.is_tarfile(name)¶ Возвращает
Trueесли name является архивным tar файлом, который может считываться модулемtarfile.
Модуль tarfile определяет следующие исключения:
-
exception
tarfile.ReadError¶ Возникает при открытии архива tar, который либо не может быть обработан модулем
tarfile, либо является каким-то образом недействительным.
-
exception
tarfile.CompressionError¶ Возникает, когда метод сжатия не поддерживается или когда данные не могут быть правильно декодированы.
-
exception
tarfile.StreamError¶ Возникает из-за ограничений, типичных для потокоподобных объектов
TarFile.
-
exception
tarfile.ExtractError¶ Создается для ошибок non-fatal при использовании
TarFile.extract(), но только еслиTarFile.errorlevel== 2.
-
exception
tarfile.HeaderError¶ Вызывается
TarInfo.frombuf(), если буфер, который он получает, недействителен.
На уровне модуля доступны следующие константы:
-
tarfile.ENCODING¶ символ кодировка по умолчанию:
'utf-8'на Windows, значение возвращенныйsys.getfilesystemencoding()иначе.
Каждая из следующих констант определяет формат архива tar, который может
создать модуль tarfile. Дополнительные сведения см. в разделе Поддерживаемые форматы tar.
-
tarfile.USTAR_FORMAT¶ POSIX.1-1988 (устар) формат.
-
tarfile.GNU_FORMAT¶ Формат GNU tar.
-
tarfile.PAX_FORMAT¶ Формат POSIX.1-2001 (pax).
-
tarfile.DEFAULT_FORMAT¶ Формат по умолчанию для создания архивов. В настоящее время это
PAX_FORMAT.Изменено в версии 3.8: Формат по умолчанию для новых архивов был изменен на
PAX_FORMATизGNU_FORMAT.
См.также
- Модуль
zipfile - Документация стандартного модуля
zipfile. - Операции архивирования
- Документация по средствам архивирования более высокого уровня,
предоставляемая стандартным модулем
shutil. - Руководство по GNU tar, базовый формат tar
- Документация для файлов архива tar, включая расширения GNU tar.
Объекты TarFile¶
Объект TarFile обеспечивает интерфейс с архивом tar. Архив tar
представляет собой последовательность блоков. Элемент архива (сохраненный файл)
состоит из блока заголовка, за которым следуют блоки данных. Файл можно хранить
в архиве tar несколько раз. Каждый элемент архива представлен TarInfo
объектом, подробные сведения см. в разделе Объекты TarInfo.
Объект TarFile можно используемый как диспетчер контекст в with
инструкция. Он будет автоматически закрыт по завершении блокировки. Обратите
внимание, что в случае исключения архив, открытый для записи, не будет завершен;
будет закрыт только внутренне используемый объект файла. Пример использования см.
в разделе «Примеры».
Добавлено в версии 3.2: Добавлена поддержка протокола управления контекст.
-
class
tarfile.TarFile(name=None, mode='r', fileobj=None, format=DEFAULT_FORMAT, tarinfo=TarInfo, dereference=False, ignore_zeros=False, encoding=ENCODING, errors='surrogateescape', pax_headers=None, debug=0, errorlevel=0)¶ Все следующие аргументы являются необязательными и также доступны как сущность атрибуты.
name - это путь к архиву. name может быть путеподобным объектом. Он может быть опущен, если дано fileobj. В этом случае
nameатрибут объекта файла используемый, если он существует.mode либо
'r'для чтения из существующего архива,'a'для добавления данных в существующий файл,'w'для создания нового файла, перезаписывающего существующий, либо'x'для создания нового файла, если он еще не существует.Если fileobj дано, оно используемый для чтения или записи данных. Если это можно определить, mode переопределяется режимом fileobj. fileobj будет используемый из положения 0.
Примечание
fileobj не закрыт, когда
TarFileзакрыт.format управляет форматом архива для записи. Это должна быть одна из констант
USTAR_FORMAT,GNU_FORMATилиPAX_FORMAT, определенных на уровне модуля. При чтении формат будет автоматически обнаружен, даже если в одном архиве присутствуют разные форматы.Аргумент tarinfo можно используемый для замены класса
TarInfoпо умолчанию другим.Если dereference
False, добавьте в архив символьные и жесткие ссылки. Если этоTrue, добавьте содержимое целевых файлов в архив. Это не влияет на системы, которые не поддерживают символьные ссылки.Если ignore_zeros
False, обработайте пустой блок как конец архива. Если этоTrue, пропустите пустые (и недопустимые) блоки и попробуйте получить как можно больше членов. Это полезно только для чтения конкатенированных или поврежденных архивов.debug можно установить от
0(без сообщений отладки) до3(все сообщения отладки). Сообщения записываются вsys.stderr.Если errorlevel
0, все ошибки игнорируются при использованииTarFile.extract(). Тем не менее, они отображаются как сообщения об ошибках в выходных данных отладки, когда отладка включена. Если1, все ошибки fatal возникают как исключенияOSError. При2все ошибки non-fatal также рассматриваются как исключенияTarError.Аргументы encoding и errors определяют символ кодировка, используемый для чтения или записи архива, а также способ обработки ошибок преобразования. Настройки по умолчанию будут работать для большинства пользователей. Подробные сведения см. в разделе Проблемы с Юникодом.
Аргумент pax_headers является дополнительным словарем строки, который добавляется в виде глобального заголовка pax, если format
PAX_FORMAT.Изменено в версии 3.2: Используйте
'surrogateescape'в качестве значения по умолчанию для аргумента errors.Изменено в версии 3.5: Добавлен режим
'x'(исключительного создания).Изменено в версии 3.6: Параметр name принимает путеподобный объект.
-
classmethod
TarFile.open(...)¶ Альтернативный конструктор. Функция
tarfile.open()на самом деле является ярлыком к этому методу.
-
TarFile.getmember(name)¶ Возвращает объект
TarInfoдля name-членов. Если name не удается найти в архиве,KeyErrorподнимается.Примечание
Если элемент встречается в архиве более одного раза, его последнее появление считается самой актуальной версией.
-
TarFile.getmembers()¶ Возвращает членов архива в виде списка
TarInfoобъектов. Список имеет тот же порядок, что и элементы в архиве.
-
TarFile.getnames()¶ Возвращает участников в виде списка их имен. Он имеет тот же порядок, что и список, возвращенный
getmembers().
-
TarFile.list(verbose=True, *, members=None)¶ Печать оглавления в
sys.stdout. Если verboseFalse, печатаются только имена участников. ПриTrueпроизводится выход, аналогичный выходному выходу ls -l. Если задан дополнительный members, он должен быть подмножеством списка, возвращенныйgetmembers().Изменено в версии 3.5: Добавлен параметр members.
-
TarFile.next()¶ Возвращает следующий элемент архива в качестве объекта
TarInfo, когдаTarFileоткрыт для чтения. ВозвращаетNone, если их больше нет.
-
TarFile.extractall(path=".", members=None, *, numeric_owner=False)¶ Извлечь все элементы из архива в текущий рабочий каталог или path каталога. Если задан дополнительный members, он должен быть подмножеством списка, возвращенный
getmembers(). Сведения о директории, такие как владелец, время изменения и разрешения, устанавливаются после извлечения всех участников. Это делается, чтобы обойти две проблемы: время модификации каталога сбрасывается каждый раз, когда в нем создается файл. И, если разрешения каталога не разрешают запись, извлечение файлов в него завершится ошибкой.Если numeric_owner
True, используемый номера uid и gid из tarfile, чтобы установить владельца/группу для извлеченных файлов. В противном случае именованные значения из тарфила будут используемый.Предупреждение
Никогда не извлекайте архивы из ненадежных источников без предварительной проверки. Возможно, что файлы создаются вне path, например, элементы с абсолютными именами файлов, начинающимися с
"/", или имена файлов с двумя точками"..".Изменено в версии 3.5: Добавлен параметр numeric_owner.
Изменено в версии 3.6: Параметр path принимает путеподобный объект.
-
TarFile.extract(member, path="", set_attrs=True, *, numeric_owner=False)¶ Извлечь элемент из архива в текущий рабочий каталог, используя его полное имя. Его файловая информация извлекается максимально точно. member может быть именем файла или
TarInfoобъектом. С помощью path можно указать другой каталог. path может быть путеподобный объект. атрибуты файлов (владелец, время, режим) устанавливаются, если set_attrs не имеет значения false.Если numeric_owner
True, используемый номера uid и gid из tarfile, чтобы установить владельца/группу для извлеченных файлов. В противном случае именованные значения из тарфила будут используемый.Примечание
Метод
extract()не учитывает несколько проблем извлечения. В большинстве случаев следует использовать методextractall().Предупреждение
См. предупреждение для
extractall().Изменено в версии 3.2: Добавлен параметр set_attrs.
Изменено в версии 3.5: Добавлен параметр numeric_owner.
Изменено в версии 3.6: Параметр path принимает путеподобный объект.
-
TarFile.extractfile(member)¶ Извлечь элемент из архива как файловый объект. member может быть именем файла или
TarInfoобъектом. Если member является обычным файлом или ссылкой,io.BufferedReaderобъект возвращенный. В противном случаеNoneбудет возвращен.Изменено в версии 3.3: Возвращает объект
io.BufferedReader.
-
TarFile.add(name, arcname=None, recursive=True, *, filter=None)¶ Добавить name файла в архив. name может быть любым типом файла (каталог, fifo, символьная ссылка и т.д.). Если указано, arcname указывает альтернативное имя файла в архиве. Каталоги добавляются рекурсивно по умолчанию. Этого можно избежать, установив для recursive значение
False. Рекурсия добавляет записи в отсортированном порядке. Если filter задано, это должна быть функция, которая принимает аргументTarInfoобъекта и возвращает измененный объектTarInfo. Если вместо этого возвращаетNoneобъектTarInfoбудет исключен из архива. Пример см. в разделе Примеры.Изменено в версии 3.2: Добавлен параметр filter.
Изменено в версии 3.7: Рекурсия добавляет записи в отсортированном порядке.
-
TarFile.addfile(tarinfo, fileobj=None)¶ Добавить
TarInfoобъекта tarinfo в архив. Если fileobj дано, оно должно быть двоичным файлом, аtarinfo.sizeбайты считываются из него и добавляются в архив. Можно создаватьTarInfoобъекты непосредственно или с помощьюgettarinfo().
-
TarFile.gettarinfo(name=None, arcname=None, fileobj=None)¶ Создать объект
TarInfoиз результатаos.stat()или эквивалента существующего файла. Файл или называет name или определяется как файловый объект fileobj с файлом дескриптор. name может быть путеподобным объектом. Если указано, arcname указывает альтернативное имя файла в архиве, в противном случае имя берется из fileobj «snameатрибут, или из аргумента name. Имя должно быть текстовой строкой.Можно изменить некоторые атрибуты
TarInfoперед их добавлением с помощьюaddfile(). Если файловый объект не является обычным файловым объектом, расположенным в начале файла, может потребоваться изменение таких атрибуты, какsize. Это относится к таким объектам, какGzipFile. Этотnameтакже может быть модифицирован, и в этом случае arcname может быть фиктивной строкой.Изменено в версии 3.6: Параметр name принимает путеподобный объект.
-
TarFile.close()¶ Закрыть
TarFile. В режиме записи к архиву добавляются два завершающих нулевых блока.
-
TarFile.pax_headers¶ Словарь, содержащий ключ-значение пары глобальных заголовков pax.
Объекты TarInfo¶
Объект TarInfo представляет один элемент в TarFile. Помимо хранения всех
требуемых атрибуты файла (типа файла, размера, времени, разрешений, владельца
и т.д.), он предоставляет некоторые полезные методы для определения его типа. Он
не содержит самих данных файла.
TarInfo объекты возвращенный методами TarFile getmember(), getmembers() и
gettarinfo().
-
classmethod
TarInfo.frombuf(buf, encoding, errors)¶ Создать и вернуть объект
TarInfoот строка буферизует buf.Вызывает
HeaderError, если буфер недействителен.
-
classmethod
TarInfo.fromtarfile(tarfile)¶ Читать следующий член от
TarFileобъекта tarfile и возвращает это, какTarInfoобъект.
-
TarInfo.tobuf(format=DEFAULT_FORMAT, encoding=ENCODING, errors='surrogateescape')¶ Создать буфер строка из объекта
TarInfo. Сведения о аргументах см. в конструкторе классаTarFile.Изменено в версии 3.2: Используйте
'surrogateescape'в качестве значения по умолчанию для аргумента errors.
Объект TarInfo имеет следующие публичные атрибуты данных:
-
TarInfo.name¶ Имя поля архива.
-
TarInfo.size¶ Размер в байтах.
-
TarInfo.mtime¶ Время последней модификации.
-
TarInfo.mode¶ Биты разрешения.
-
TarInfo.type¶ Тип файла. type обычно - одна из этих констант:
REGTYPE,AREGTYPE,LNKTYPE,SYMTYPE,DIRTYPE,FIFOTYPE,CONTTYPE,CHRTYPE,BLKTYPE,GNUTYPE_SPARSE. Для более удобного определения типаTarInfoобъекта используйтеis*()ниже методы.
-
TarInfo.linkname¶ Имя целевого файла, которое присутствует только во
TarInfoобъектах типаLNKTYPEиSYMTYPE.
-
TarInfo.uid¶ Идентификатор пользователя, который первоначально хранил этого участника.
-
TarInfo.gid¶ Идентификатор группы пользователя, который первоначально хранил этого участника.
-
TarInfo.uname¶ Имя пользователя.
-
TarInfo.gname¶ Название группы.
-
TarInfo.pax_headers¶ Словарь, содержащий ключ-значение пары связанного расширенного заголовка pax.
Объект TarInfo также предоставляет несколько удобных методов запроса:
Интерфейс командной строки¶
Добавлено в версии 3.4.
Модуль tarfile обеспечивает простой интерфейс командной строки для
взаимодействия с архивами tar.
Если требуется создать новый архив tar, укажите его имя после параметра
-c, а затем перечислите имена файлов, которые должны быть включены:
$ python -m tarfile -c monty.tar spam.txt eggs.txt
Передача каталога также допустима:
$ python -m tarfile -c monty.tar life-of-brian_1979/
Если требуется извлечь архив tar в текущий каталог, используйте опцию
-e:
$ python -m tarfile -e monty.tar
Можно также извлечь архив tar в другой каталог, передав имя каталога:
$ python -m tarfile -e monty.tar other-dir/
Для получения списка файлов в архиве tar используйте -l опцию:
$ python -m tarfile -l monty.tar
Параметры командной строки¶
-
-c<tarfile> <source1> ... <sourceN>¶ -
--create<tarfile> <source1> ... <sourceN>¶ Создать файл tarfile из исходных файлов.
-
-e<tarfile> [<output_dir>]¶ -
--extract<tarfile> [<output_dir>]¶ Извлеч файл tarfile в текущий каталог, если output_dir не указан.
-
-v,--verbose¶ Многословный вывод.
Примеры¶
Извлечение всего архива tar в текущий рабочий каталог:
import tarfile
tar = tarfile.open("sample.tar.gz")
tar.extractall()
tar.close()
Извлечение подмножества архива tar с помощью TarFile.extractall() с помощью функции
генератора вместо списка:
import os
import tarfile
def py_files(members):
for tarinfo in members:
if os.path.splitext(tarinfo.name)[1] == ".py":
yield tarinfo
tar = tarfile.open("sample.tar.gz")
tar.extractall(members=py_files(tar))
tar.close()
Создание несжатого архива tar из списка имен файлов:
import tarfile
tar = tarfile.open("sample.tar", "w")
for name in ["foo", "bar", "quux"]:
tar.add(name)
tar.close()
Тот же пример использования with инструкции:
import tarfile
with tarfile.open("sample.tar", "w") as tar:
for name in ["foo", "bar", "quux"]:
tar.add(name)
Как прочитать архив gzip со сжатием и отобразить некоторые сведения об участниках:
import tarfile
tar = tarfile.open("sample.tar.gz", "r:gz")
for tarinfo in tar:
print(tarinfo.name, "is", tarinfo.size, "bytes in size and is ", end="")
if tarinfo.isreg():
print("a regular file.")
elif tarinfo.isdir():
print("a directory.")
else:
print("something else.")
tar.close()
Создание архива и сброс пользовательской информации с помощью параметра
filter в TarFile.add():
import tarfile
def reset(tarinfo):
tarinfo.uid = tarinfo.gid = 0
tarinfo.uname = tarinfo.gname = "root"
return tarinfo
tar = tarfile.open("sample.tar.gz", "w:gz")
tar.add("foo", filter=reset)
tar.close()
Поддерживаемые форматы tar¶
Существует три формата tar, которые можно создать с помощью модуля
tarfile:
Формат POSIX.1-1988 ustar (
USTAR_FORMAT). Он поддерживает имена файлов длиной не более 256 символов и до 100 символов текста ссылки. Максимальный размер файла - 8 GiB. Это старый и ограниченный, но широко поддерживаемый формат.Формат tar GNU (
GNU_FORMAT). Он поддерживает длинные имена файлов и linknames, файлы больше 8 GiB и разреженные файлы. Является фактическим стандартом для систем GNU/Linux.tarfileполностью поддерживает расширения GNU tar для длинных имен, поддержка разреженных файлов доступна только для чтения.Формат POSIX.1-2001 pax (
PAX_FORMAT). Это наиболее гибкий формат практически без ограничений. Он поддерживает длинные имена файлов и linknames, большие файлы и хранит пути в переносимом виде. Современные реализации tar, включая GNU tar, bsdtar/libarchive и star, полностью поддерживают расширенные возможности pax; некоторые старые или неподдерживаемые библиотеки не могут, но должны относиться к pax архивам так, как если бы они были в универсально поддерживаемом формате ustar. Это текущий формат по умолчанию для новых архивов.Он расширяет существующий формат ustar дополнительными заголовками для информации, которая не может быть сохранена иначе. Существует два вида заголовков pax: расширенные заголовки влияют только на последующий заголовок файла, глобальные заголовки действительны для всего архива и влияют на все следующие файлы. Все данные в заголовке pax кодированный в UTF-8 по соображениям переносимости.
Есть еще несколько вариантов формата tar, которые можно прочитать, но не создать:
- Древний формат V7. Это первый формат tar от Unix Седьмое издание, хранящий только обычные файлы и каталоги. Имена не должны содержать более 100 символов, сведения об именах пользователей и групп отсутствуют. Некоторые архивы имеют просчитанные контрольные суммы заголовка в случае полей с символами, отличными от ASCII.
- Расширенный формат SunOS tar. Этот формат является вариантом формата POSIX.1-2001 pax, но несовместим.
Проблемы с Юникодом¶
Формат tar изначально задумывался для создания резервных копий на ленточных накопителях с основным акцентом на сохранение информации о файловой системе. В настоящее время архивы tar обычно используемый для распространения файлов и обмена архивами по сетям. Одной из проблем исходного формата (который является основой всех остальных форматов) является отсутствие концепции поддержки различных кодировок символ. Например, обычный архив tar, созданный в системе UTF-8, не может быть правильно прочитан в системе Latin-1, если он содержит не ASCII символы. Текстовые метаданные (например, имена файлов, имена линий, имена пользователей/групп) будут повреждены. К сожалению, нет возможности для автоматического обнаружения кодировка архива. Формат pax был разработан для решения этой проблемы. Он хранит метаданные, не относящиеся к ASCII, с помощью универсального символ кодировка UTF-8.
Деталями преобразования символ в tarfile управляют аргументы
encoding и errors ключевого класса TarFile.
encoding определяет символ кодировка для использования метаданных в
архиве. По умолчанию используется значение sys.getfilesystemencoding() или 'ascii' в
качестве резервного. В зависимости от того, считывается или записывается архив,
метаданные должны быть либо декодированы, либо кодированный. Если encoding не
установлен должным образом, это преобразование может завершиться ошибкой.
Аргумент errors определяет способ обработки символов, которые невозможно
преобразовать. Возможные значения перечислены в разделе Обработчики ошибок. По
умолчанию используется схема 'surrogateescape' которая также используется Python
для вызовов файловой системы (см. Имена файлов, аргументы командной строки и переменные среды).
Для PAX_FORMAT архивов (по умолчанию) encoding обычно не требуется,
поскольку все метаданные хранятся с использованием UTF-8. encoding
используемый только в редких случаях, когда двоичные заголовки pax декодируются
или когда хранятся строки с суррогатными символами.
