# `codecs` — Codec registry and base classes

Вихідний код: Lib/codecs.py

Цей модуль визначає базові класи для стандартних кодеків Python (кодери та декодери) і надає доступ до внутрішнього реєстру кодеків Python, який керує процесом пошуку кодека та обробки помилок. Більшість стандартних кодеків — це кодування тексту, які кодують текст у байти (і декодують байти в текст), але є також кодеки, які кодують текст у текст і байти в байти. Спеціальні кодеки можуть кодувати та декодувати між довільними типами, але деякі функції модулів обмежено для використання спеціально з текстовими кодуваннями або з кодеками, які кодують у `bytes`.

Модуль визначає такі функції для кодування та декодування будь-яким кодеком:

codecs.encode(obj, encoding='utf-8', errors='strict')

  Кодує obj за допомогою кодека, зареєстрованого для кодування.

  Помилки можуть бути надані для встановлення потрібної схеми обробки помилок. Обробником помилок за замовчуванням є `'strict'`, що означає, що помилки кодування викликають `ValueError` (або більш специфічний підклас кодека, наприклад `UnicodeEncodeError`). Зверніться до Базові класи кодеків для отримання додаткової інформації щодо обробки помилок кодека.

codecs.decode(obj, encoding='utf-8', errors='strict')

  Декодує obj за допомогою кодека, зареєстрованого для кодування.

  Помилки можуть бути надані для встановлення потрібної схеми обробки помилок. Обробником помилок за замовчуванням є `'strict'`, що означає, що помилки декодування викликають `ValueError` (або більш специфічний підклас кодека, такий як `UnicodeDecodeError`). Зверніться до Базові класи кодеків для отримання додаткової інформації про обробку помилок кодека.

Повну інформацію про кожен кодек також можна переглянути безпосередньо:

codecs.lookup(encoding)

  Шукає інформацію про кодек у реєстрі кодеків Python і повертає об’єкт `CodecInfo`, як визначено нижче.

  Кодування спочатку шукаються в кеші реєстру. Якщо не знайдено, сканується список зареєстрованих функцій пошуку. Якщо об’єкт `CodecInfo` не знайдено, виникає `LookupError`. В іншому випадку об’єкт `CodecInfo` зберігається в кеші та повертається абоненту.

class codecs.CodecInfo(encode, decode, streamreader=None, streamwriter=None, incrementalencoder=None, incrementaldecoder=None, name=None)

  Відомості про кодек під час пошуку реєстру кодеків. Аргументи конструктора зберігаються в однойменних атрибутах:

  name

    Назва кодування.

  encode
  decode

    Функції кодування та декодування без збереження стану. Це мають бути функції чи методи, які мають той самий інтерфейс, що й методи `encode()` і `decode()` екземплярів кодека (див. Інтерфейс кодека). Очікується, що функції або методи працюватимуть у режимі без збереження стану.

  incrementalencoder
  incrementaldecoder

    Класи інкрементального кодера та декодера або заводські функції. Вони мають забезпечувати інтерфейс, визначений базовими класами `IncrementalEncoder` та `IncrementalDecoder` відповідно. Інкрементні кодеки можуть підтримувати стан.

  streamwriter
  streamreader

    Класи потокового запису та читання або фабричні функції. Вони мають забезпечувати інтерфейс, визначений базовими класами `StreamWriter` і `StreamReader` відповідно. Потокові кодеки можуть підтримувати стан.

Щоб спростити доступ до різних компонентів кодека, модуль надає такі додаткові функції, які використовують `lookup()` для пошуку кодека:

codecs.getencoder(encoding)

  Знайдіть кодек для даного кодування та поверніть його функцію кодувальника.

  Викликає `LookupError`, якщо кодування не знайдено.

codecs.getdecoder(encoding)

  Знайдіть кодек для даного кодування та поверніть його функцію декодера.

  Викликає `LookupError`, якщо кодування не знайдено.

codecs.getincrementalencoder(encoding)

  Знайдіть кодек для даного кодування та поверніть його інкрементний клас кодера або заводську функцію.

  Викликає `LookupError`, якщо кодування не знайдено або кодек не підтримує інкрементний кодер.

codecs.getincrementaldecoder(encoding)

  Знайдіть кодек для даного кодування та поверніть його інкрементний клас декодера або заводську функцію.

  Викликає `LookupError`, якщо кодування не знайдено або кодек не підтримує інкрементний декодер.

codecs.getreader(encoding)

  Знайдіть кодек для вказаного кодування та поверніть його клас `StreamReader` або фабричну функцію.

  Викликає `LookupError`, якщо кодування не знайдено.

codecs.getwriter(encoding)

  Знайдіть кодек для вказаного кодування та поверніть його клас `StreamWriter` або фабричну функцію.

  Викликає `LookupError`, якщо кодування не знайдено.

Спеціальні кодеки стають доступними, якщо зареєструвати відповідну функцію пошуку кодеків:

codecs.register(search_function)

  Зареєструйте функцію пошуку кодеків. Очікується, що функції пошуку прийматимуть один аргумент, тобто ім’я кодування, яке складається з малих літер із дефісами та пробілами, перетворене на підкреслення, і повертатиме об’єкт `CodecInfo`. Якщо функція пошуку не може знайти задане кодування, вона має повернути `None`.

  Змінено в версії 3.9: Дефіси та пробіли перетворюються на підкреслення.

codecs.unregister(search_function)

  Скасуйте реєстрацію функції пошуку кодеків і очистіть кеш реєстру. Якщо функція пошуку не зареєстрована, нічого не робіть.

  Нове в версії 3.10.

Хоча вбудований `open()` і пов’язаний модуль `io` є рекомендованим підходом для роботи з кодованими текстовими файлами, цей модуль надає додаткові службові функції та класи, які дозволяють використовувати ширший діапазон кодеків під час роботи з бінарними файлами:

codecs.open(filename, mode='r', encoding=None, errors='strict', buffering=-1)

  Відкрийте закодований файл у заданому режимі та поверніть екземпляр `StreamReaderWriter`, забезпечуючи прозоре кодування/декодування. Типовим режимом файлу є `'r''`, що означає відкриття файлу в режимі читання.

  Примітка

  If encoding is not `None`, then the underlying encoded files are always opened in binary mode. No automatic conversion of `'\n'` is done on reading and writing. The mode argument may be any binary mode acceptable to the built-in `open()` function; the `'b'` is automatically added.

  encoding визначає кодування, яке буде використано для файлу. Дозволяється будь-яке кодування, яке кодує та декодує з байтів, а типи даних, які підтримуються методами файлів, залежать від використовуваного кодека.

  errors можуть бути надані для визначення обробки помилок. За замовчуванням встановлено значення `'strict''`, що спричиняє виникнення `ValueError` у разі виникнення помилки кодування.

  buffering має те саме значення, що й вбудована функція `open()`. За замовчуванням він дорівнює -1, що означає, що буде використано стандартний розмір буфера.

  Змінено в версії 3.11: The `'U'` mode has been removed.

codecs.EncodedFile(file, data_encoding, file_encoding=None, errors='strict')

  Повертає екземпляр `StreamRecoder`, загорнуту версію файлу, яка забезпечує прозоре перекодування. Вихідний файл закривається, коли закривається упакована версія.

  Дані, записані в обгорнутий файл, декодуються відповідно до заданого data_encoding, а потім записуються в вихідний файл у вигляді байтів за допомогою file_encoding. Байти, зчитані з вихідного файлу, декодуються відповідно до file_encoding, а результат кодується за допомогою data_encoding.

  Якщо file_encoding не вказано, за умовчанням буде data_encoding.

  errors можуть бути надані для визначення обробки помилок. За замовчуванням встановлено `'strict'`, що спричиняє `ValueError`, що виникає у випадку помилки кодування.

codecs.iterencode(iterator, encoding, errors='strict', **kwargs)

  Використовує інкрементальний кодувальник для ітеративного кодування вхідних даних, наданих iterator. Ця функція є generator. Аргумент errors (як і будь-який інший аргумент ключового слова) передається до інкрементального кодувальника.

  Ця функція вимагає, щоб кодек приймав текстові об’єкти `str` для кодування. Тому він не підтримує кодувальники байт-у-байт, такі як `base64_codec`.

codecs.iterdecode(iterator, encoding, errors='strict', **kwargs)

  Використовує інкрементальний декодер для ітеративного декодування вхідних даних, наданих iterator. Ця функція є generator. Аргумент errors (як і будь-який інший аргумент ключового слова) передається до інкрементального декодера.

  Ця функція вимагає, щоб кодек приймав об’єкти `bytes` для декодування. Тому він не підтримує кодувальники тексту в текст, такі як `rot_13`, хоча `rot_13` можна використовувати еквівалентно з `iterencode()`.

Модуль також надає наступні константи, які корисні для читання та запису в залежні від платформи файли:

codecs.BOM
codecs.BOM_BE
codecs.BOM_LE
codecs.BOM_UTF8
codecs.BOM_UTF16
codecs.BOM_UTF16_BE
codecs.BOM_UTF16_LE
codecs.BOM_UTF32
codecs.BOM_UTF32_BE
codecs.BOM_UTF32_LE

  Ці константи визначають різні послідовності байтів, будучи мітками порядку байтів Unicode (BOM) для кількох кодувань. Вони використовуються в потоках даних UTF-16 і UTF-32 для позначення використовуваного порядку байтів, а в UTF-8 як підпис Юнікод. `BOM_UTF16` є або `BOM_UTF16_BE`, або `BOM_UTF16_LE` залежно від рідного порядку байтів платформи, `BOM` є псевдонімом для `BOM_UTF16`, `BOM_LE` для `BOM_UTF16_LE` і `BOM_BE` для `BOM_UTF16_BE`. Інші представляють специфікацію в кодуваннях UTF-8 і UTF-32.

## Базові класи кодеків

Модуль `codecs` визначає набір базових класів, які визначають інтерфейси для роботи з об’єктами кодеків, а також може бути використаний як основа для користувацьких реалізацій кодеків.

Кожен кодек має визначати чотири інтерфейси, щоб зробити його придатним для використання як кодек у Python: кодер без стану, декодер без стану, читач потоку та запис потоку. Зчитувач і записувач потоків зазвичай повторно використовують кодер/декодер без збереження стану для реалізації протоколів файлів. Автори кодеків також повинні визначити, як кодек оброблятиме помилки кодування та декодування.

### Обробники помилок

Щоб спростити та стандартизувати обробку помилок, кодеки можуть реалізовувати різні схеми обробки помилок, приймаючи рядковий аргумент errors:

    >>> 'German ß, ♬'.encode(encoding='ascii', errors='backslashreplace')
    b'German \\xdf, \\u266c'
    >>> 'German ß, ♬'.encode(encoding='ascii', errors='xmlcharrefreplace')
    b'German &#223;, &#9836;'

Наступні обробники помилок можна використовувати з усіма кодеками Python Стандартні кодування:

Значення | Значення
--- | ---
`'строгий''` | Викликати `UnicodeError` (або підклас), це типово. Реалізовано в `strict_errors()`.
`'ігнорувати''` | Ігноруйте неправильні дані та продовжуйте без додаткового повідомлення. Реалізовано в `ignore_errors()`.
`'замінити'` | Замініть маркером заміни. У кодуванні використовуйте `?` (символ ASCII). Під час декодування використовуйте `�` (U+FFFD, офіційний СИМВОЛ ЗАМІНИ). Реалізовано в `replace_errors()`.
`'заміна зворотної косої риски''` | Replace with backslashed escape sequences. On encoding, use hexadecimal form of Unicode code point with formats `\xhh` `\uxxxx` `\Uxxxxxxxx`. On decoding, use hexadecimal form of byte value with format `\xhh`. Implemented in `backslashreplace_errors()`.
`'сурогатна втеча'` | Під час декодування замініть байт окремим сурогатним кодом у діапазоні від `U+DC80` до `U+DCFF`. Потім цей код буде перетворено назад у той самий байт, коли під час кодування даних використовується обробник помилок `'surrogateescape'`. (Докладніше див. PEP 383.)

Наступні обробники помилок застосовуються лише до кодування (в межах кодування тексту):

Значення | Значення
--- | ---
`'xmlcharrefreplace'` | Replace with XML/HTML numeric character reference, which is a decimal form of Unicode code point with format `&#num;`. Implemented in `xmlcharrefreplace_errors()`.
`'namereplace'` | Замініть керуючу послідовність `\N{...}`, що відображається в фігурних дужках — це властивість Name із бази даних символів Unicode. Реалізовано в `namereplace_errors()`.

Крім того, наступний обробник помилок є специфічним для даних кодеків:

Значення | Кодеки | Значення
--- | --- | ---
`'сурогатний пропуск''` | utf-8, utf-16, utf-32, utf-16-be, utf-16-le, utf-32-be, utf-32-le | Дозволити кодування та декодування сурогатної кодової точки (`U+D800` - `U+DFFF`) як звичайну кодову точку. Інакше ці кодеки розглядають наявність сурогатної кодової точки в `str` як помилку.

Нове в версії 3.1: Обробники помилок `'surrogateescape'` і `'surrogatepass'`.

Змінено в версії 3.4: Обробник помилок `'surrogatepass'` тепер працює з кодеками utf-16* і utf-32*.

Нове в версії 3.5: Обробник помилок `'namereplace`.

Змінено в версії 3.5: Обробник помилок `'backslashreplace'` тепер працює з декодуванням і перекладом.

Набір дозволених значень можна розширити, зареєструвавши новий іменований обробник помилок:

codecs.register_error(name, error_handler)

  Зареєструйте функцію обробки помилок error_handler під назвою name. Аргумент error_handler буде викликаний під час кодування та декодування у разі помилки, якщо name вказано як параметр errors.

  Для кодування error_handler буде викликано з екземпляром `UnicodeEncodeError`, який містить інформацію про розташування помилки. Обробник помилок повинен або викликати це чи інше виключення, або повернути кортеж із заміною некодованої частини вхідних даних і позиції, де кодування повинно продовжуватися. Заміна може бути `str` або `bytes`. Якщо заміною є байти, кодер просто скопіює їх у вихідний буфер. Якщо заміна є рядком, кодер закодує заміну. Кодування продовжується на початковому введенні у вказаній позиції. Від’ємні значення позиції розглядатимуться як такі, що відносяться до кінця вхідного рядка. Якщо результуюча позиція виходить за межі, буде викликано `IndexError`.

  Декодування та переклад працює аналогічно, за винятком того, що `UnicodeDecodeError` або `UnicodeTranslateError` буде передано обробнику, а заміна з обробника помилок буде введена безпосередньо у вивід.

Раніше зареєстровані обробники помилок (включаючи стандартні обробники помилок) можна шукати за назвою:

codecs.lookup_error(name)

  Повернути обробник помилок, попередньо зареєстрований під іменем name.

  Викликає `LookupError`, якщо обробник не знайдено.

Наступні стандартні обробники помилок також доступні як функції рівня модуля:

codecs.strict_errors(exception)

  Реалізує `'сувору'` обробку помилок.

  Кожна помилка кодування або декодування викликає `UnicodeError`.

codecs.ignore_errors(exception)

  Реалізує обробку помилок `'ignore''`.

  Некоректні дані ігноруються; кодування або декодування продовжується без додаткового повідомлення.

codecs.replace_errors(exception)

  Реалізує обробку помилок `'replace''`.

  Замінює `?` (символ ASCII) для помилок кодування або `�` (U+FFFD, офіційний СИМВОЛ ЗАМІНИ) для помилок декодування.

codecs.backslashreplace_errors(exception)

  Реалізує обробку помилок `'backslashreplace'`.

  Malformed data is replaced by a backslashed escape sequence. On encoding, use the hexadecimal form of Unicode code point with formats `\xhh` `\uxxxx` `\Uxxxxxxxx`. On decoding, use the hexadecimal form of byte value with format `\xhh`.

  Змінено в версії 3.5: Працює з декодуванням і перекладом.

codecs.xmlcharrefreplace_errors(exception)

  Реалізує обробку помилок `'xmlcharrefreplace'` (лише для кодування в межах text encoding).

  The unencodable character is replaced by an appropriate XML/HTML numeric character reference, which is a decimal form of Unicode code point with format `&#num;` .

codecs.namereplace_errors(exception)

  Реалізує обробку помилок `'namereplace'` (лише для кодування в межах text encoding).

  Некодований символ замінюється керуючою послідовністю `\N{...}`. Набір символів, що з’являються в фігурних дужках, є властивістю Name з бази даних символів Unicode. Наприклад, німецьку малу літеру `'ß'` буде перетворено на послідовність байтів `\N{LATIN SMALL LETTER SHARP S}` .

  Нове в версії 3.5.

### Кодування та декодування без збереження стану

Базовий клас `Codec` визначає ці методи, які також визначають функціональні інтерфейси кодера та декодера без збереження стану:

class codecs.Codec
  encode(input, errors='strict')

    Кодує об’єкт input і повертає кортеж (вихідний об’єкт, споживана довжина). Наприклад, text encoding перетворює рядковий об’єкт на об’єкт bytes, використовуючи певне кодування набору символів (наприклад, `cp1252` або `iso-8859-1`).

    Аргумент errors визначає застосовувану обробку помилок. За замовчуванням `'сувора''` обробка.

    Метод може не зберігати стан в екземплярі `Codec`. Використовуйте `StreamWriter` для кодеків, які мають зберігати стан, щоб зробити кодування ефективним.

    У цій ситуації кодер повинен мати можливість обробляти вхідні дані нульової довжини та повертати порожній об’єкт типу вихідного об’єкта.

  decode(input, errors='strict')

    Декодує об’єкт input і повертає кортеж (вихідний об’єкт, споживана довжина). Наприклад, для text encoding декодування перетворює об’єкт bytes, закодований за допомогою кодування певного набору символів, на рядковий об’єкт.

    Для текстових кодувань і кодеків від байтів до байтів input має бути об’єктом bytes або таким, який забезпечує інтерфейс буфера лише для читання – наприклад, об’єкти буфера та файли, відображені в пам’яті.

    Аргумент errors визначає застосовувану обробку помилок. За замовчуванням `'сувора''` обробка.

    Метод може не зберігати стан в екземплярі `Codec`. Використовуйте `StreamReader` для кодеків, які мають зберігати стан, щоб зробити декодування ефективним.

    У цій ситуації декодер повинен мати можливість обробляти вхідні дані нульової довжини та повертати порожній об’єкт типу вихідного об’єкта.

### Інкрементне кодування та декодування

Класи `IncrementalEncoder` і `IncrementalDecoder` забезпечують базовий інтерфейс для інкрементного кодування та декодування. Кодування/декодування вхідних даних виконується не одним викликом функції кодувальника/декодера без збереження стану, а кількома викликами методу `encode()`/`decode()` інкрементального кодувальника /декодер. Інкрементний кодер/декодер відстежує процес кодування/декодування під час викликів методів.

Об’єднаний вихід викликів методу `encode()`/`decode()` такий самий, як якби всі окремі входи були об’єднані в один, і цей вхід було закодовано/декодовано за допомогою кодер/декодер без стану.

#### Об’єкти IncrementalEncoder

Клас `IncrementalEncoder` використовується для кодування вхідних даних у кілька кроків. Він визначає наступні методи, які повинен визначити кожен інкрементальний кодер, щоб бути сумісним із реєстром кодеків Python.

class codecs.IncrementalEncoder(errors='strict')

  Конструктор для екземпляра `IncrementalEncoder`.

  Усі інкрементні кодери повинні забезпечувати цей інтерфейс конструктора. Вони можуть вільно додавати додаткові аргументи ключових слів, але лише ті, що визначені тут, використовуються реєстром кодеків Python.

  `IncrementalEncoder` може реалізовувати різні схеми обробки помилок, надаючи аргумент ключового слова errors. Перегляньте Обробники помилок можливі значення.

  Аргумент errors буде призначено однойменному атрибуту. Призначення цьому атрибуту дає змогу перемикатися між різними стратегіями обробки помилок протягом життя об’єкта `IncrementalEncoder`.

  encode(object, final=False)

    Кодує об’єкт (з урахуванням поточного стану кодувальника) і повертає отриманий закодований об’єкт. Якщо це останній виклик `encode()`, final має бути true (за умовчанням — false).

  reset()

    Скиньте кодер до початкового стану. Вихідні дані відхиляються: викличте `.encode(object, final=True)`, передаючи порожній байт або текстовий рядок, якщо необхідно, щоб скинути кодер і отримати вихідні дані.

  getstate()

    Повертає поточний стан кодувальника, який має бути цілим числом. Реалізація має гарантувати, що `0` є найпоширенішим станом. (Стани, які є складнішими, ніж цілі числа, можна перетворити на ціле число шляхом маршалінгу/вибору стану та кодування байтів результуючого рядка в ціле число.)

  setstate(state)

    Встановіть стан кодера на state. state має бути станом кодувальника, який повертає `getstate()`.

#### Об’єкти IncrementalDecoder

Клас `IncrementalDecoder` використовується для декодування вхідних даних у кілька кроків. Він визначає наступні методи, які повинен визначити кожен інкрементний декодер, щоб бути сумісним із реєстром кодеків Python.

class codecs.IncrementalDecoder(errors='strict')

  Конструктор для екземпляра `IncrementalDecoder`.

  Усі інкрементні декодери повинні забезпечувати цей інтерфейс конструктора. Вони можуть вільно додавати додаткові аргументи ключових слів, але лише ті, що визначені тут, використовуються реєстром кодеків Python.

  `IncrementalDecoder` може реалізовувати різні схеми обробки помилок, надаючи аргумент ключового слова errors. Перегляньте Обробники помилок можливі значення.

  Аргумент errors буде призначено однойменному атрибуту. Призначення цьому атрибуту дає змогу перемикатися між різними стратегіями обробки помилок протягом життя об’єкта `IncrementalDecoder`.

  decode(object, final=False)

    Декодує об’єкт (з урахуванням поточного стану декодера) і повертає отриманий декодований об’єкт. Якщо це останній виклик `decode()`, final має бути true (за умовчанням — false). Якщо final має значення true, декодер повинен повністю декодувати вхідні дані та скинути всі буфери. Якщо це неможливо (наприклад, через неповну послідовність байтів у кінці введення), він повинен ініціювати обробку помилок, як у випадку без стану (що може спричинити виняток).

  reset()

    Скиньте декодер до початкового стану.

  getstate()

    Повернути поточний стан декодера. Це має бути кортеж із двома елементами, перший має бути буфером, що містить ще недекодований вхід. Друге має бути цілим числом і може бути додатковою інформацією про стан. (Реалізація має переконатися, що `0` є найпоширенішою додатковою інформацією про стан.) Якщо ця додаткова інформація про стан `0`, має бути можливим встановити декодер у стан, який не має буферизації вхідних даних і `0` як додаткову інформацію про стан, так що подача попередньо буферизованого вхідного сигналу в декодер повертає його до попереднього стану без виведення. (Додаткову інформацію про стан, яка є складнішою, ніж цілі числа, можна перетворити на ціле число шляхом маршалінгу/вибору інформації та кодування байтів отриманого рядка в ціле число.)

  setstate(state)

    Встановіть стан декодера на state. state має бути станом декодера, який повертає `getstate()`.

### Кодування та декодування потоку

The `StreamWriter` and `StreamReader` classes provide generic working interfaces which can be used to implement new encoding submodules very easily. See `encodings.utf_8` for an example of how this is done.

#### Об’єкти StreamWriter

Клас `StreamWriter` є підкласом `Codec` і визначає наступні методи, які повинен визначити кожен записувач потоків, щоб бути сумісним із реєстром кодеків Python.

class codecs.StreamWriter(stream, errors='strict')

  Конструктор для екземпляра `StreamWriter`.

  Цей інтерфейс конструктора мають надавати всі автори потоків. Вони можуть вільно додавати додаткові аргументи ключових слів, але лише ті, що визначені тут, використовуються реєстром кодеків Python.

  Аргумент потік має бути файлоподібним об’єктом, відкритим для запису тексту або двійкових даних, відповідно до конкретного кодека.

  `StreamWriter` може реалізовувати різні схеми обробки помилок, надаючи аргумент ключового слова errors. Перегляньте Обробники помилок для стандартних обробників помилок, які може підтримувати основний потоковий кодек.

  Аргумент errors буде призначено однойменному атрибуту. Призначення цьому атрибуту дає змогу перемикатися між різними стратегіями обробки помилок протягом життя об’єкта `StreamWriter`.

  write(object)

    Записує закодований вміст об’єкта в потік.

  writelines(list)

    Записує конкатенований ітерований рядок у потік (можливо, повторно використовуючи метод `write()`). Нескінченні або дуже великі ітерації не підтримуються. Стандартні кодеки від байтів до байтів не підтримують цей метод.

  reset()

    Скидає буфери кодеків, які використовуються для збереження внутрішнього стану.

    Виклик цього методу повинен гарантувати, що дані на виході переведені в чистий стан, який дозволяє додавати нові свіжі дані без необхідності повторного сканування всього потоку для відновлення стану.

Окрім вищезазначених методів, `StreamWriter` також має успадкувати всі інші методи та атрибути базового потоку.

#### Об’єкти StreamReader

Клас `StreamReader` є підкласом `Codec` і визначає наступні методи, які повинен визначити кожен зчитувач потоку, щоб бути сумісним із реєстром кодеків Python.

class codecs.StreamReader(stream, errors='strict')

  Конструктор для екземпляра `StreamReader`.

  Усі зчитувачі потоків повинні надавати цей інтерфейс конструктора. Вони можуть вільно додавати додаткові аргументи ключових слів, але лише ті, що визначені тут, використовуються реєстром кодеків Python.

  Аргумент потік має бути файлоподібним об’єктом, відкритим для читання тексту або двійкових даних, відповідно до конкретного кодека.

  `StreamReader` може реалізовувати різні схеми обробки помилок, надаючи аргумент ключового слова errors. Перегляньте Обробники помилок для стандартних обробників помилок, які може підтримувати основний потоковий кодек.

  Аргумент errors буде призначено однойменному атрибуту. Призначення цьому атрибуту дає змогу перемикатися між різними стратегіями обробки помилок протягом життя об’єкта `StreamReader`.

  Набір дозволених значень для аргументу errors можна розширити за допомогою `register_error()`.

  read(size=-1, chars=-1, firstline=False)

    Декодує дані з потоку та повертає отриманий об’єкт.

    Аргумент chars вказує кількість декодованих кодових точок або байтів, які потрібно повернути. Метод `read()` ніколи не поверне більше даних, ніж вимагається, але може повернути менше, якщо їх буде недостатньо.

    Аргумент size вказує на приблизну максимальну кількість закодованих байтів або кодових точок для читання для декодування. Декодер може змінювати цей параметр за потреби. Значення за замовчуванням -1 вказує на читання та декодування якомога більшої кількості. Цей параметр призначений для запобігання необхідності декодувати великі файли за один крок.

    Прапорець firstline вказує на те, що було б достатньо повернути лише перший рядок, якщо в наступних рядках є помилки декодування.

    Метод повинен використовувати стратегію жадібного читання, тобто він повинен зчитувати стільки даних, скільки дозволено у визначенні кодування та заданого розміру, наприклад. якщо в потоці доступні додаткові закінчення кодування або маркери стану, їх також слід прочитати.

  readline(size=None, keepends=True)

    Прочитати один рядок із вхідного потоку та повернути декодовані дані.

    size, якщо задано, передається як аргумент розміру в метод `read()` потоку.

    Якщо keepends має значення false, закінчення рядків буде видалено з повернутих рядків.

  readlines(sizehint=None, keepends=True)

    Прочитати всі рядки, доступні у вхідному потоці, і повернути їх як список рядків.

    Закінчення рядків реалізуються за допомогою методу кодека `decode()` і включаються до записів списку, якщо keepends має значення true.

    sizehint, якщо його задано, передається як аргумент size у метод потоку `read()`.

  reset()

    Скидає буфери кодеків, які використовуються для збереження внутрішнього стану.

    Зауважте, що переміщення потоку не повинно відбуватися. Цей метод насамперед призначений для відновлення після помилок декодування.

Окрім вищезазначених методів, `StreamReader` також має успадкувати всі інші методи та атрибути базового потоку.

#### Об’єкти StreamReaderWriter

`StreamReaderWriter` — це зручний клас, який дозволяє обгортати потоки, які працюють як у режимі читання, так і в режимі запису.

Конструкція така, що можна використовувати фабричні функції, які повертає функція `lookup()` для створення екземпляра.

class codecs.StreamReaderWriter(stream, Reader, Writer, errors='strict')

  Створює екземпляр `StreamReaderWriter`. потік має бути файлоподібним об’єктом. Reader і Writer повинні бути фабричними функціями або класами, що забезпечують інтерфейс `StreamReader` і `StreamWriter` відповідно. Обробка помилок виконується так само, як визначено для читачів і записів потоку.

Екземпляри `StreamReaderWriter` визначають комбіновані інтерфейси класів `StreamReader` і `StreamWriter`. Вони успадковують усі інші методи та атрибути від основного потоку.

#### Об’єкти StreamRecoder

`StreamRecoder` переводить дані з одного кодування в інше, що іноді корисно, коли ви маєте справу з різними середовищами кодування.

Конструкція така, що можна використовувати фабричні функції, які повертає функція `lookup()` для створення екземпляра.

class codecs.StreamRecoder(stream, encode, decode, Reader, Writer, errors='strict')

  Creates a `StreamRecoder` instance which implements a two-way conversion: encode and decode work on the frontend — the data visible to code calling `read()` and `write()`, while Reader and Writer work on the backend — the data in stream.

  Ви можете використовувати ці об’єкти для прозорого перекодування, наприклад, з Latin-1 на UTF-8 і назад.

  Аргумент потік має бути файлоподібним об’єктом.

  Аргументи encode і decode мають відповідати інтерфейсу `Codec`. Reader і Writer повинні бути фабричними функціями або класами, що забезпечують об’єкти інтерфейсу `StreamReader` і `StreamWriter` відповідно.

  Обробка помилок виконується так само, як визначено для читачів і записів потоку.

Екземпляри `StreamRecoder` визначають комбіновані інтерфейси класів `StreamReader` і `StreamWriter`. Вони успадковують усі інші методи та атрибути основного потоку.

## Кодування та Unicode

Рядки зберігаються внутрішньо як послідовності кодових точок у діапазоні `U+0000`–`U+10FFFF`. (Див. PEP 393 для отримання додаткової інформації про реалізацію.) Коли рядковий об’єкт використовується поза центральним процесором і пам’яттю, стає проблемою порядок байтів і те, як ці масиви зберігаються як байти. Як і в інших кодеках, серіалізація рядка в послідовність байтів відома як кодування, а відтворення рядка з послідовності байтів відоме як декодування. Існує безліч різних кодеків серіалізації тексту, які в сукупності називаються текстовими кодуваннями.

Найпростіше кодування тексту (називається `'latin-1'` або `'iso-8859-1'`) відображає кодові точки 0–255 на байти `0x0`–`0xff`, що означає, що рядковий об’єкт, який містить кодові точки вище `U+00FF`, не може бути закодований цим кодеком. Це призведе до появи `UnicodeEncodeError`, яка виглядає так (хоча деталі повідомлення про помилку можуть відрізнятися): `UnicodeEncodeError: кодек 'latin-1' не може закодувати символ '\u1234' у позиції 3 : порядковий номер не в діапазоні (256)`.

Існує ще одна група кодувань (так звані кодування charmap), які вибирають іншу підмножину всіх кодових точок Unicode і те, як ці кодові точки відображаються на байти `0x0`–`0xff`. Щоб побачити, як це робиться, просто відкрийте, наприклад. `encodings/cp1252.py` (це кодування, яке використовується в основному в Windows). Існує рядкова константа з 256 символами, яка показує, який символ зіставляється з яким значенням байта.

Усі ці кодування можуть кодувати лише 256 із 1114112 кодових точок, визначених у Unicode. Простий і зрозумілий спосіб збереження кожної кодової точки Unicode полягає в тому, щоб зберегти кожну кодову точку у вигляді чотирьох послідовних байтів. Є дві можливості: зберігати байти в порядку старшого або малого порядку. Ці два кодування називаються `UTF-32-BE` і `UTF-32-LE` відповідно. Їх недолік полягає в тому, що якщо напр. якщо ви використовуєте `UTF-32-BE` на машині з порядковим порядком байтів, вам завжди доведеться міняти місцями байти під час кодування та декодування. `UTF-32` уникає цієї проблеми: байти завжди будуть у природному порядку байтів. Коли ці байти зчитуються процесором з іншим порядком байтів, тоді байти потрібно поміняти місцями. Щоб мати можливість виявити порядок байтів послідовності байтів `UTF-16` або `UTF-32`, існує так звана BOM («Позначка порядку байтів»). Це символ Unicode `U+FEFF`. Цей символ можна додавати до кожної послідовності байтів `UTF-16` або `UTF-32`. Версія цього символу з заміною байтів (`0xFFFE`) є неприпустимим символом, який може не з’являтися в тексті Unicode. Отже, коли перший символ у послідовності байтів `UTF-16` або `UTF-32` виглядає як `U+FFFE`, байти потрібно поміняти місцями під час декодування. На жаль, символ `U+FEFF` мав другу мету як `НУЛЬОВА ШИРИНА БЕЗ РОЗБИВУ`: символ, який не має ширини і не дозволяє розділити слово. Це може напр. використовувати для надання підказок алгоритму лігатури. З Юнікодом 4.0 використання `U+FEFF` як `НУЛЬОВА ШИРИНА НЕРОЗБИВНОГО ПРОБІЛУ` застаріло (з `U+2060` (`WORD JOINER`) виконує цю роль). Незважаючи на це, програмне забезпечення Unicode все ще має бути в змозі обробляти `U+FEFF` в обох ролях: як BOM, це пристрій для визначення макета зберігання закодованих байтів і зникає, коли послідовність байтів була декодована в рядок; як `НУЛЬОВА ШИРИНА БЕЗ РОЗБИВУ` це звичайний символ, який буде декодовано, як і будь-який інший.

Є інше кодування, яке може кодувати повний діапазон символів Unicode: UTF-8. UTF-8 — це 8-бітне кодування, що означає, що в UTF-8 немає проблем із порядком байтів. Кожен байт у послідовності байтів UTF-8 складається з двох частин: бітів маркера (старших бітів) і бітів корисного навантаження. Біти маркера являють собою послідовність із нуля до чотирьох бітів `1`, за якими йде `0` біт. Символи Unicode кодуються таким чином (де x є бітами корисного навантаження, які при з’єднанні дають символ Unicode):

Діапазон | Кодування
--- | ---
`U-00000000` … `U-0000007F` | 0xxxxxxx
`U-00000080` … `U-000007FF` | 110xxxxx 10xxxxxx
`U-00000800` … `U-0000FFFF` | 1110xxxx 10xxxxxx 10xxxxxx
`U-00010000` … `U-0010FFFF` | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

Наймолодшим бітом символу Юнікод є крайній правий біт x.

Оскільки UTF-8 є 8-бітним кодуванням, специфікація матеріалів не потрібна, і будь-який символ `U+FEFF` у декодованому рядку (навіть якщо це перший символ) розглядається як `НУЛЬОВА ШИРИНА БЕЗ РОЗБИВУ` .

Без зовнішньої інформації неможливо достовірно визначити, яке кодування було використано для кодування рядка. Кожне кодування charmap може декодувати будь-яку випадкову послідовність байтів. Однак це неможливо з UTF-8, оскільки послідовності байтів UTF-8 мають структуру, яка не допускає довільних послідовностей байтів. Щоб підвищити надійність виявлення кодування UTF-8, Microsoft винайшла варіант UTF-8 (який Python називає `"utf-8-sig"`) для своєї програми Notepad: перед будь-яким із символів Unicode записується у файл, записується BOM у кодуванні UTF-8 (який виглядає так як послідовність байтів: `0xef`, `0xbb`, `0xbf`). Оскільки малоймовірно, щоб будь-який файл, закодований charmap, починався з цих значень байтів (що, наприклад, відображатиметься на

> МАЛА ЛАТИНСЬКА БУКВА I З ДІАРЕЗИСОМ
> ПОДВІЙНІ КУТНІ ЛАПКИ, Спрямовані вправо
> ПЕРЕВЕРНУТИЙ ЗНАК ПИТАННЯ

в iso-8859-1), це збільшує ймовірність того, що кодування `utf-8-sig` можна правильно вгадати з послідовності байтів. Отже, тут BOM використовується не для визначення порядку байтів, який використовується для створення послідовності байтів, а як підпис, який допомагає вгадати кодування. Під час кодування кодек utf-8-sig записуватиме `0xef`, `0xbb`, `0xbf` як перші три байти до файлу. Під час декодування `utf-8-sig` пропустить ці три байти, якщо вони відображаються як перші три байти у файлі. В UTF-8 використання BOM не рекомендується, і його слід уникати.

## Стандартні кодування

Python поставляється з низкою вбудованих кодеків, реалізованих як функції C або зі словниками як таблиці відображення. У наведеній нижче таблиці наведено кодеки за назвами разом із кількома поширеними псевдонімами та мовами, для яких, ймовірно, використовується кодування. Ні список псевдонімів, ні список мов не є вичерпними. Зауважте, що варіанти написання, які відрізняються лише регістром або використовують дефіс замість підкреслення, також є дійсними псевдонімами; отже, напр. `'utf-8''` є дійсним псевдонімом для `'utf_8''` кодека.

Деталі реалізації CPython: Деякі поширені кодування можуть обійти механізм пошуку кодеків для підвищення продуктивності. Ці можливості оптимізації розпізнаються CPython лише для обмеженого набору (незалежних від регістру) псевдонімів: utf-8, utf8, latin-1, latin1, iso-8859-1, iso8859-1, mbcs (лише Windows), ascii, us -ascii, utf-16, utf16, utf-32, utf32 і те саме, використовуючи підкреслення замість тире. Використання альтернативних псевдонімів для цих кодувань може призвести до сповільнення виконання.

Змінено в версії 3.6: Можливість оптимізації визнана для us-ascii.

Багато наборів символів підтримують однакові мови. Вони відрізняються за окремими символами (наприклад, чи підтримується ЗНАК ЄВРО чи ні), а також за призначенням символів позиціям коду. Зокрема, для європейських мов зазвичай існують такі варіанти:

- кодовий набір ISO 8859

- кодова сторінка Microsoft Windows, яка зазвичай походить від коду 8859, але замінює контрольні символи додатковими графічними символами

- кодову сторінку IBM EBCDIC

- кодова сторінка IBM PC, сумісна з ASCII

Кодек | Псевдоніми | Мови
--- | --- | ---
ascii | 646, us-ascii | англійська
великий5 | big5-tw, csbig5 | Традиційний китайський
big5hkscs | big5-hkscs, hkscs | Традиційний китайський
cp037 | IBM037, IBM039 | англійська
cp273 | 273, IBM273, csIBM273 | Німецький Нове в версії 3.4.
cp424 | EBCDIC-CP-HE, IBM424 | іврит
cp437 | 437, IBM437 | англійська
cp500 | EBCDIC-CP-BE, EBCDIC-CP-CH, IBM500 | Західна Європа
cp720 |  | арабська
cp737 |  | грецька
cp775 | IBM775 | Балтійські мови
cp850 | 850, IBM850 | Західна Європа
cp852 | 852, IBM852 | Центральна та Східна Європа
cp855 | 855, IBM855 | Bulgarian, Byelorussian, Macedonian, Russian, Serbian
cp856 |  | іврит
cp857 | 857, IBM857 | турецька
cp858 | 858, IBM858 | Західна Європа
cp860 | 860, IBM860 | португальська
cp861 | 861, CP-IS, IBM861 | ісландська
cp862 | 862, IBM862 | іврит
cp863 | 863, IBM863 | канадський
cp864 | IBM864 | арабська
cp865 | 865, IBM865 | датська, норвезька
cp866 | 866, IBM866 | російський
cp869 | 869, CP-GR, IBM869 | грецька
cp874 |  | тайська
cp875 |  | грецька
cp932 | 932, ms932, mskanji, ms-kanji | Японський
cp949 | 949, ms949, uhc | корейська
cp950 | 950, мс950 | Традиційний китайський
cp1006 |  | урду
cp1026 | ibm1026 | турецька
cp1125 | 1125, ibm1125, cp866u, рос | українська Нове в версії 3.4.
cp1140 | ibm1140 | Західна Європа
cp1250 | вікна-1250 | Центральна та Східна Європа
cp1251 | вікна-1251 | Bulgarian, Byelorussian, Macedonian, Russian, Serbian
cp1252 | вікна-1252 | Західна Європа
cp1253 | вікна-1253 | грецька
cp1254 | windows-1254 | турецька
cp1255 | вікна-1255 | іврит
cp1256 | вікна-1256 | арабська
cp1257 | вікна-1257 | Балтійські мови
cp1258 | вікна-1258 | в’єтнамська
euc_jp | eucjp, ujis, u-jis | Японський
euc_jis_2004 | jisx0213, eucjis2004 | Японський
euc_jisx0213 | eucjisx0213 | Японський
euc_kr | euckr, корейська, ksc5601, ks_c-5601, ks_c-5601-1987, ksx1001, ks_x-1001 | корейська
gb2312 | китайська, csiso58gb231280, euc-cn, euccn, eucgb2312-cn, gb2312-1980, gb2312-80, iso-ir-58 | Спрощена Китайська
gbk | 936, cp936, ms936 | Єдина китайська
gb18030 | gb18030-2000 | Єдина китайська
Гц | hzgb, hz-gb, hz-gb-2312 | Спрощена Китайська
iso2022_jp | csiso2022jp, iso2022jp, iso-2022-jp | Японський
iso2022_jp_1 | iso2022jp-1, iso-2022-jp-1 | Японський
iso2022_jp_2 | iso2022jp-2, iso-2022-jp-2 | Японська, корейська, спрощена китайська, західноєвропейська, грецька
iso2022_jp_2004 | iso2022jp-2004, iso-2022-jp-2004 | Японський
iso2022_jp_3 | iso2022jp-3, iso-2022-jp-3 | Японський
iso2022_jp_ext | iso2022jp-ext, iso-2022-jp-ext | Японський
iso2022_kr | csiso2022kr, iso2022kr, iso-2022-kr | корейська
latin_1 | iso-8859-1, iso8859-1, 8859, cp819, latin, latin1, L1 | Західна Європа
iso8859_2 | iso-8859-2, latin2, L2 | Центральна та Східна Європа
iso8859_3 | iso-8859-3, latin3, L3 | Есперанто, мальтійська
iso8859_4 | iso-8859-4, latin4, L4 | Балтійські мови
iso8859_5 | iso-8859-5, кирил | Bulgarian, Byelorussian, Macedonian, Russian, Serbian
iso8859_6 | iso-8859-6, араб | арабська
iso8859_7 | iso-8859-7, грецький, грецький8 | грецька
iso8859_8 | iso-8859-8, іврит | іврит
iso8859_9 | iso-8859-9, latin5, L5 | турецька
iso8859_10 | iso-8859-10, latin6, L6 | Скандинавські мови
iso8859_11 | iso-8859-11, тай | тайські мови
iso8859_13 | iso-8859-13, latin7, L7 | Балтійські мови
iso8859_14 | iso-8859-14, latin8, L8 | кельтські мови
iso8859_15 | iso-8859-15, latin9, L9 | Західна Європа
iso8859_16 | iso-8859-16, latin10, L10 | Південно-Східна Європа
Йохаб | cp1361, ms1361 | корейська
koi8_r |  | російський
koi8_t |  | таджицька Нове в версії 3.5.
koi8_u |  | українська
kz1048 | kz_1048, strk1048_2002, rk1048 | казахська Нове в версії 3.5.
mac_cyrillic | макирилицею | Bulgarian, Byelorussian, Macedonian, Russian, Serbian
mac_greek | макгрік | грецька
mac_iceland | maciceland | ісландська
mac_latin2 | maclatin2, maccentraleurope, mac_centeuro | Центральна та Східна Європа
mac_roman | макромен, макінтош | Західна Європа
mac_turkish | macturkish | турецька
ptcp154 | csptcp154, pt154, cp154, кирилиця-азійська | казахська
shift_jis | csshiftjis, shiftjis, sjis, s_jis | Японський
shift_jis_2004 | shiftjis2004, sjis_2004, sjis2004 | Японський
shift_jisx0213 | shiftjisx0213, sjisx0213, s_jisx0213 | Японський
utf_32 | U32, utf32 | всі мови
utf_32_be | UTF-32BE | всі мови
utf_32_le | UTF-32LE | всі мови
utf_16 | U16, utf16 | всі мови
utf_16_be | UTF-16BE | всі мови
utf_16_le | UTF-16LE | всі мови
utf_7 | U7, unicode-1-1-utf-7 | всі мови
utf_8 | U8, UTF, utf8, cp65001 | всі мови
utf_8_sig |  | всі мови

Змінено в версії 3.4: Кодери utf-16* і utf-32* більше не дозволяють кодувати сурогатні кодові точки (`U+D800`–`U+DFFF`). Декодери utf-32* більше не декодують послідовності байтів, які відповідають сурогатним кодовим точкам.

Змінено в версії 3.8: `cp65001` тепер є псевдонімом `utf_8`.

## Спеціальні кодування Python

Деякі попередньо визначені кодеки є специфічними для Python, тому їхні назви кодеків не мають значення поза Python. Вони перераховані в таблицях нижче на основі очікуваних типів введення та виведення (зауважте, що хоча кодування тексту є найпоширенішим випадком використання кодеків, базова інфраструктура кодеків підтримує довільні перетворення даних, а не лише кодування тексту). Для асиметричних кодеків вказане значення описує напрямок кодування.

### Кодування тексту

Наступні кодеки забезпечують кодування `str` до `bytes` і декодування bytes-like object до `str`, подібне до кодування тексту Unicode.

Кодек | Псевдоніми | Значення
--- | --- | ---
idna |  | Реалізація RFC 3490, див. також `encodings.idna`. Підтримується лише `errors='strict'`.
mbcs | ansi, dbcs | Лише для Windows: кодуйте операнд відповідно до кодової сторінки ANSI (CP_ACP).
oem |  | Лише для Windows: кодуйте операнд відповідно до кодової сторінки OEM (CP_OEMCP). Нове в версії 3.6.
palmos |  | Кодування PalmOS 3.5.
punycode |  | Впровадити RFC 3492. Кодеки з підтримкою стану не підтримуються.
raw_unicode_escape |  | Latin-1 encoding with `\uXXXX` and `\UXXXXXXXX` for other code points. Existing backslashes are not escaped in any way. It is used in the Python pickle protocol.
невизначений |  | Викликати виняток для всіх перетворень, навіть для порожніх рядків. Обробник помилок ігнорується.
unicode_escape |  | Кодування, придатне як вміст літералу Юнікод у вихідному коді Python із кодуванням ASCII, за винятком того, що лапки не екрануються. Декодувати з вихідного коду Latin-1. Майте на увазі, що вихідний код Python насправді використовує UTF-8 за замовчуванням.

Змінено в версії 3.8: Кодек «unicode_internal» видалено.

### Двійкові перетворення

Наступні кодеки забезпечують двійкові перетворення: bytes-like object у `bytes` зіставлення. Вони не підтримуються `bytes.decode()` (який виводить лише `str`).

Кодек | Псевдоніми | Значення | Кодер / декодер
--- | --- | --- | ---
base64_codec [1] | base64, base_64 | Перетворіть операнд на багаторядковий MIME base64 (результат завжди включає `'\n'`). Змінено в версії 3.4: приймає будь-який bytes-like object як вхідні дані для кодування та декодування | `base64.encodebytes()` / `base64.decodebytes()`
bz2_codec | bz2 | Стисніть операнд за допомогою bz2. | `bz2.compress()` / `bz2.decompress()`
hex_codec | шістнадцятковий | Перетворіть операнд у шістнадцяткове подання з двома цифрами на байт. | `binascii.b2a_hex()` / `binascii.a2b_hex()`
quopri_codec | quopri, quotedprintable, quoted_printable | Перетворіть операнд на MIME-цитований для друку. | `quopri.encode()` з `quotetabs=True` / `quopri.decode()`
uu_codec | uu | Перетворіть операнд за допомогою uuencode. | `uu.encode()` / `uu.decode()` (Note: `uu` is deprecated.)
zlib_codec | zip, zlib | Стисніть операнд за допомогою gzip. | `zlib.compress()` / `zlib.decompress()`

[1]

На додаток до байт-подібних об’єктів, `'base64_codec''` також приймає лише ASCII-примірники `str` для декодування

Нове в версії 3.2: Відновлення двійкових перетворень.

Змінено в версії 3.4: Відновлення псевдонімів для бінарних перетворень.

### Перетворення тексту

Наступний кодек забезпечує перетворення тексту: відображення `str` у `str`. Він не підтримується `str.encode()` (який виводить лише `bytes`).

Кодек | Псевдоніми | Значення
--- | --- | ---
rot_13 | гниль13 | Повернути шифрування операнда за допомогою шифру Цезаря.

Нове в версії 3.2: Відновлення текстового перетворення `rot_13`.

Змінено в версії 3.4: Відновлення псевдоніма `rot13`.

## `encodings.idna` — Інтернаціоналізовані доменні імена в програмах

Цей модуль реалізує RFC 3490 (інтернаціоналізовані доменні імена в програмах) і RFC 3492 (nameprep: профіль Stringprep для інтернаціоналізованих доменних імен (IDN)). Він побудований на основі кодування `punycode` і `stringprep`.

If you need the IDNA 2008 standard from RFC 5891 and RFC 5895, use the third-party idna module.

Ці RFC разом визначають протокол для підтримки символів, відмінних від ASCII, у доменних іменах. Доменне ім’я, що містить символи, відмінні від ASCII (наприклад, `www.Alliancefrançaise.nu`), перетворюється на ASCII-сумісне кодування (ACE, наприклад `www.xn--alliancefranaise-npb.nu`). Форма ACE імені домену потім використовується в усіх місцях, де довільні символи не дозволені протоколом, наприклад у запитах DNS, HTTP Host тощо. Це перетворення здійснюється в додатку; якщо можливо, невидимі для користувача: програма повинна прозоро перетворювати мітки домену Unicode на IDNA на дроті та перетворювати мітки ACE назад у Unicode перед тим, як представляти їх користувачеві.

Python підтримує це перетворення декількома способами: кодек `idna` виконує перетворення між Юнікодом і ACE, розділяючи вхідний рядок на мітки на основі символів-роздільників, визначених у розділі 3.1 RFC 3490, і перетворюючи кожну мітку до ACE за потреби, і навпаки, розділяючи вхідний байтовий рядок на мітки на основі роздільника `.` і перетворюючи будь-які знайдені мітки ACE в Юнікод. Крім того, модуль `socket` прозоро перетворює імена хостів Unicode на ACE, тому програмам не потрібно турбуватися про перетворення самих імен хостів, коли вони передають їх модулю сокетів. Крім того, модулі, які мають імена хостів як параметри функцій, наприклад `http.client` і `ftplib`, приймають імена хостів Unicode (`http.client` потім також прозоро надсилає IDNA ім’я хоста в полі Host, якщо воно взагалі надсилає це поле).

Під час отримання імен хостів із проводу (наприклад, під час зворотного пошуку імен) автоматичне перетворення в Unicode не виконується: програми, які бажають надати такі імена хостів користувачеві, повинні декодувати їх у Unicode.

Модуль `encodings.idna` також реалізує процедуру nameprep, яка виконує певні нормалізації імен хостів, щоб досягти нечутливості до регістру міжнародних доменних імен і уніфікувати схожі символи. За бажанням можна безпосередньо використовувати функції nameprep.

encodings.idna.nameprep(label)

  Повертає запрограмовану версію мітки. Реалізація наразі передбачає рядки запиту, тому `AllowUnassigned` є істинним.

encodings.idna.ToASCII(label)

  Перетворіть мітку на ASCII, як зазначено в RFC 3490. `UseSTD3ASCIIRules` вважається false.

encodings.idna.ToUnicode(label)

  Перетворіть мітку в Unicode, як зазначено в RFC 3490.

## `encodings.mbcs` — кодова сторінка Windows ANSI

Цей модуль реалізує кодову сторінку ANSI (CP_ACP).

Availability: Windows.

Змінено в версії 3.2: До версії 3.2 аргумент errors ігнорувався; `'replace'` завжди використовувався для кодування, а `'ignore''` для декодування.

Змінено в версії 3.3: Підтримка будь-якого засобу обробки помилок.

## `encodings.utf_8_sig` — кодек UTF-8 із підписом BOM

Цей модуль реалізує варіант кодека UTF-8. Під час кодування BOM у кодуванні UTF-8 буде додано до байтів у кодуванні UTF-8. Для кодувальника зі збереженням стану це робиться лише один раз (під час першого запису в потік байтів). Під час декодування додаткова специфікація даних у кодуванні UTF-8 на початку даних буде пропущена.