Spec-Zone.ru › Haskell 9

GHC.IO.Encoding

Авторские права (c) The University of Glasgow 2008-2009
Лицензия см. libraries/base/LICENSE
Сопровождающий libraries@haskell.org
Стабильность внутренний
Переносимость непереносимый
Безопасный Haskell Safe
Язык Haskell2010

Описание

Текстовые кодеки для ввода-вывода

API этого модуля нестабилен и не предназначен для использования широкой публикой. Если вам совершенно необходимо от него зависеть, обязательно задайте строгое верхнее ограничение версии, например base < 4.X вместо base < 5, поскольку интерфейс может быстро измениться без особого предупреждения.

data BufferCodec from to state Источник

Конструкторы

BufferCodec#

Поля

  • encode# :: CodeBuffer# from to

    Функция encode преобразует элементы буфера from в буфер to. Она должна преобразовать как можно больше элементов с учётом размеров буферов, включая преобразование нуля элементов, если в to недостаточно места или from не содержит полной многобайтовой последовательности.

    Если возможны несколько вариантов возврата CodingProgress, необходимо предпочесть OutputUnderflow значению InvalidSequence. Благодаря этому библиотека ввода-вывода GHC может считать, что если обнаружено InvalidSequence, в выходном буфере доступен как минимум один элемент.

    Тот факт, что преобразуется максимально возможное число элементов, позволяет библиотеке ввода-вывода сообщать об ошибках преобразования в момент их фактического возникновения, а не при преобразовании буфера.

  • recover# :: Buffer from -> Buffer to -> State# RealWorld -> (# State# RealWorld, Buffer from, Buffer to #)

    Функция recover используется для продолжения декодирования при наличии недопустимых или непредставимых последовательностей. Сюда входят как последовательности, обнаруженные при возврате InvalidSequence функцией encode, так и случаи, когда входная последовательность байтов, по-видимому, усечена.

    Обычно для продвижения вперёд пропускается первый элемент буфера from. Вызывать эту функцию следует только в том случае, если вы уверены, что хотите выполнить пропуск, и буфер to содержит как минимум одно свободное место. Поскольку функция обрабатывает ошибку декодирования, она предполагает, что буфер from содержит как минимум один элемент.

    recover может вызвать исключение вместо пропуска каких-либо элементов.

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

    С версии: base-4.4.0.0

  • close# :: IO ()

    Связанные с кодировкой ресурсы можно освободить. После вызова close функцию encode вызывать нельзя.

  • getState# :: IO state

    Возвращает текущее состояние кодека.

    Многие кодеки не являются состояниезависимыми, и в таких случаях состояние можно представить как (). Другие кодеки хранят состояние. Например, UTF-16 распознаёт символ BOM (маркер порядка байтов) в начале входных данных, а затем запоминает, следует ли использовать прямой или обратный порядок байтов. В этом случае состояние кодека включает две части информации: находимся ли мы в начале потока (BOM встречается только в начале) и, если нет, какой порядок байтов использовать — прямой или обратный.

  • setState# :: state -> IO ()

Объединённые шаблоны

pattern BufferCodec :: CodeBuffer from to -> (Buffer from -> Buffer to -> IO (Buffer from, Buffer to)) -> IO () -> IO state -> (state -> IO ()) -> BufferCodec from to state

data TextEncoding Источник

TextEncoding — это описание схемы преобразования последовательностей байтов в последовательности символов Unicode и обратно.

Например, UTF-8 — это кодировка символов Unicode в последовательность байтов. TextEncoding для UTF-8 — это utf8.

Конструкторы

TextEncoding

Поля

  • textEncodingName :: String

    строка, которую можно передать в mkTextEncoding, чтобы создать эквивалентный TextEncoding.

  • mkTextDecoder :: IO (TextDecoder dstate)

    Создаёт средство для декодирования байтов в символы: полученный результат нельзя использовать совместно для нескольких последовательностей байтов или одновременно в нескольких потоках.

  • mkTextEncoder :: IO (TextEncoder estate)

    Создаёт средство для кодирования символов в байты: полученный результат нельзя использовать совместно для нескольких последовательностей символов или одновременно в нескольких потоках.

Экземпляры
Подробности экземпляров
Show TextEncoding Источник

С версии: base-4.3.0.0

Подробности экземпляра

Определён в GHC.Internal.IO.Encoding.Types

Методы

showsPrec :: Int -> TextEncoding -> ShowS Источник

show :: TextEncoding -> String Источник

showList :: [TextEncoding] -> ShowS Источник

type TextEncoder state = BufferCodec CharBufElem Word8 state Источник

type TextDecoder state = BufferCodec Word8 CharBufElem state Источник

data CodingProgress Источник

С версии: base-4.4.0.0

Конструкторы

InputUnderflow

Операция остановлена, поскольку доступно недостаточно элементов входных данных либо вся входная последовательность успешно преобразована.

OutputUnderflow

Операция остановлена, поскольку в выходном буфере недостаточно свободных элементов.

InvalidSequence

Операция остановлена, поскольку в выходном буфере достаточно свободного места для вывода как минимум одного закодированного символа ASCII, но входные данные содержат недопустимую или непредставимую последовательность.

Экземпляры
Подробности экземпляров
Eq CodingProgress Источник

С версии: base-4.4.0.0

Подробности экземпляра

Определён в GHC.Internal.IO.Encoding.Types

Методы

(==) :: CodingProgress -> CodingProgress -> Bool Источник

(/=) :: CodingProgress -> CodingProgress -> Bool Источник

Show CodingProgress Источник

С версии: base-4.4.0.0

Подробности экземпляра

Определён в GHC.Internal.IO.Encoding.Types

Методы

showsPrec :: Int -> CodingProgress -> ShowS Источник

show :: CodingProgress -> String Источник

showList :: [CodingProgress] -> ShowS Источник

latin1 :: TextEncoding Источник

Кодировка Latin1 (ISO8859-1). Эта кодировка напрямую сопоставляет байты первым 256 кодовым точкам Unicode и поэтому не является полной кодировкой Unicode. Попытка записать символ с кодовой точкой выше '\255' в Handle с использованием кодировки latin1 приведёт к ошибке.

latin1_encode :: CharBuffer -> Buffer Word8 -> IO (CharBuffer, Buffer Word8) Источник

latin1_decode :: Buffer Word8 -> CharBuffer -> IO (Buffer Word8, CharBuffer) Источник

utf8 :: TextEncoding Источник

Кодировка Unicode UTF-8

utf8_bom :: TextEncoding Источник

Кодировка Unicode UTF-8 с маркером порядка байтов (BOM; последовательность байтов 0xEF 0xBB 0xBF). Эта кодировка ведёт себя так же, как utf8, за исключением того, что при вводе последовательность BOM игнорируется в начале потока, а при выводе добавляется в его начало.

Маркер порядка байтов в UTF-8 строго говоря не нужен, но иногда используется для определения кодировки файла.

utf16 :: TextEncoding Источник

Кодировка Unicode UTF-16 (для указания порядка байтов следует использовать маркер порядка байтов).

utf16le :: TextEncoding Источник

Кодировка Unicode UTF-16 (младшим байтом вперёд)

utf16be :: TextEncoding Источник

Кодировка Unicode UTF-16 (старшим байтом вперёд)

utf32 :: TextEncoding Источник

Кодировка Unicode UTF-32 (для указания порядка байтов следует использовать маркер порядка байтов).

utf32le :: TextEncoding Источник

Кодировка Unicode UTF-32 (младшим байтом вперёд)

utf32be :: TextEncoding Источник

Кодировка Unicode UTF-32 (старшим байтом вперёд)

initLocaleEncoding :: TextEncoding Источник

С версии: base-4.5.0.0

getLocaleEncoding :: IO TextEncoding Источник

Кодировка Unicode текущей локали

С версии: base-4.5.0.0

getFileSystemEncoding :: IO TextEncoding Источник

Кодировка текущей локали, позволяющая преобразовывать произвольные декодируемые байты туда и обратно без потерь.

Не рассчитывайте на совместимость кодировки с Unicode: она может оказаться ASCII или любой другой кодировкой.

Эта TextEncoding используется для декодирования и кодирования аргументов командной строки и переменных среды на платформах, отличных от Windows.

В Windows по возможности *не следует* использовать эту кодировку, поскольку применение кодовых страниц считается устаревшим: строки следует получать с помощью «широких» API семейства W для UTF-16.

С версии: base-4.5.0.0

getForeignEncoding :: IO TextEncoding Источник

Кодировка Unicode текущей локали, в которой декодируемые байты заменяются ближайшими визуальными аналогами. Используется функциями маршалинга CString в Foreign.C.String

С версии: base-4.5.0.0

setLocaleEncoding :: TextEncoding -> IO () Источник

Задаёт кодировку локали для программы. Локаль влияет на кодирование и декодирование Char при их преобразовании в байты и обратно: например, при чтении и записи файлов (readFile', writeFile) или при использовании стандартного ввода-вывода (getLine, putStrLn). Например, если программа выводит символы, отличные от ASCII, рекомендуется выполнить

setLocaleEncoding utf8

В Windows этого недостаточно: консоль является устройством с состоянием, которое нужно настроить с помощью System.Win32.Console.setConsoleOutputCP, а затем восстановить исходные настройки. Эти нюансы рассмотрены в пакете code-page, предоставляющем кроссплатформенный System.IO.CodePage.withCodePage с гарантированным восстановлением.

Неверная кодировка локали обычно приводит к сообщениям об ошибках, таким как "invalid argument (cannot decode byte sequence starting from ...)" или "invalid argument (cannot encode character ...)".

С версии: base-4.5.0.0

setFileSystemEncoding :: TextEncoding -> IO () Источник

С версии: base-4.5.0.0

setForeignEncoding :: TextEncoding -> IO () Источник

С версии: base-4.5.0.0

char8 :: TextEncoding Источник

Кодировка, в которой кодовые точки Unicode преобразуются в байты посредством взятия остатка от деления кодовой точки на 256. При декодировании байты напрямую преобразуются в соответствующую кодовую точку.

Эта кодировка никогда не приводит к ошибкам ни в одном из направлений. Однако при кодировании теряется информация, поэтому последовательность кодирования и последующего декодирования не является тождественным преобразованием.

С версии: base-4.4.0.0

mkTextEncoding :: String -> IO TextEncoding Источник

Находит именованную кодировку Unicode. Может завершиться ошибкой с исключением

  • isDoesNotExistError, если кодировка неизвестна

Набор известных кодировок зависит от системы, но включает как минимум:

  • UTF-8
  • UTF-16, UTF-16BE, UTF-16LE
  • UTF-32, UTF-32BE, UTF-32LE

Для указания способа обработки недопустимых символов предусмотрен дополнительный синтаксис (заимствованный из GNU iconv):

  • суффикс //IGNORE, например UTF-8//IGNORE, приводит к игнорированию всех недопустимых последовательностей при вводе; при выводе отбрасываются все кодовые точки, не представимые в целевой кодировке.
  • суффикс //TRANSLIT задаёт выбор символа-замены для недопустимых последовательностей или кодовых точек.
  • суффикс //ROUNDTRIP использует механизм экранирования в стиле PEP383, чтобы представлять любые недопустимые байты во входных данных как кодовые точки Unicode (в частности, как отдельные суррогаты, которые обычно недопустимы в UTF-32). При выводе эти специальные кодовые точки обнаруживаются и преобразуются обратно в соответствующие исходные байты.

Теоретически этот механизм позволяет преобразовывать произвольные данные туда и обратно через String без потери данных. На практике следует учитывать два ограничения:

  1. Это может сработать только для кодировки, являющейся надмножеством ASCII: из соображений безопасности мы отказываемся экранировать любые байты со значениями меньше 128. Многие интересующие нас кодировки являются надмножествами ASCII (в частности, можно считать, что кодировка локали является надмножеством ASCII), но многие другие, например UTF-16, таковыми не являются.
  2. Если базовая кодировка сама по себе не поддерживает обратное преобразование без потерь, этот механизм может завершиться неудачей. Кодировки с обратным преобразованием без потерь — это кодировки, имеющие инъективное отображение в Unicode. Этому критерию соответствуют почти все кодировки, но некоторые — нет. В частности, Shift-JIS (CP932) и Big5 содержат несколько вариантов кодирования одной и той же кодовой точки Unicode.

В Windows доступ к поддерживаемым кодовым страницам можно получить, используя префикс CP; например, "CP1250".

argvEncoding :: IO TextEncoding Источник

Внутренняя кодировка argv

© The University of Glasgow and others
Licensed under a BSD-style license (see top of the page).
https://downloads.haskell.org/~ghc/9.14.1/docs/libraries/base-4.22.0.0-66f8/GHC-IO-Encoding.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API