Spec-Zone.ru › Elisp

Явное кодирование и декодирование

Все операции, которые передают текст в Emacs и из него, могут использовать систему кодирования для кодирования или декодирования текста. Вы также можете явно кодировать и декодировать текст, используя функции в этом разделе.

Результат кодирования и входные данные для декодирования — не обычный текст. Они логически состоят из последовательности значений байтов; то есть последовательности ASCII и восьмибитных символов. В однобайтовых буферах и строках эти символы имеют коды в диапазоне от 0 до #xFF (255). В многобайтовом буфере или строке восьмибитные символы имеют коды символов, превышающие #xFF (см. Представления текста), но Emacs прозрачно преобразует их в их однобайтовые значения при кодировании или декодировании такого текста.

Обычный способ чтения файла в буфер как последовательности байтов, чтобы вы могли явно декодировать содержимое, — это insert-file-contents-literally (см. Чтение из файлов); в качестве альтернативы, укажите аргумент rawfile, отличный от nil, при посещении файла с помощью find-file-noselect. Эти методы приводят к созданию однобайтового буфера.

Обычный способ использования последовательности байтов, полученной в результате явного кодирования текста, — это скопировать её в файл или процесс — например, записать её с помощью write-region (см. Запись во файлы), и подавить кодирование, привязав coding-system-for-write к no-conversion.

Вот функции для выполнения явного кодирования или декодирования. Функции кодирования генерируют последовательности байтов; функции декодирования предназначены для работы с последовательностями байтов. Все эти функции отбрасывают свойства текста. Они также устанавливают last-coding-system-used на используемую систему кодирования.

Команда: encode-coding-region start end coding-system &optional destination

Эта команда кодирует текст с start по end в соответствии с системой кодирования coding-system. Обычно закодированный текст заменяет исходный текст в буфере, но необязательный аргумент destination может изменить это. Если destination — это буфер, закодированный текст вставляется в этот буфер после точки (точка не перемещается); если это t, команда возвращает закодированный текст в виде однобайтовой строки, не вставляя его.

Если закодированный текст вставлен в какой-либо буфер, эта команда возвращает длину закодированного текста.

Результат кодирования — логически последовательность байтов, но буфер остаётся многобайтовым, если он был многобайтовым до этого, а любые 8-битные байты преобразуются в их многобайтовую форму (см. Представления текста).

Не используйте undecided для coding-system при кодировании текста, так как это может привести к неожиданным результатам. Вместо этого используйте select-safe-coding-system (см. select-safe-coding-system), чтобы предложить подходящее кодирование, если для coding-system нет очевидного значения.

Функция: encode-coding-string string coding-system &optional nocopy buffer

Эта функция кодирует текст в string в соответствии с системой кодирования coding-system. Она возвращает новую строку, содержащую закодированный текст, за исключением случаев, когда nocopy отлично от nil, в таком случае функция может вернуть саму string, если операция кодирования тривиальна. Результат кодирования — однобайтовая строка.

Команда: decode-coding-region start end coding-system &optional destination

Эта команда декодирует текст с start по end в соответствии с системой кодирования coding-system. Для того, чтобы явное декодирование было полезным, текст перед декодированием должен представлять собой последовательность значений байтов, но как многобайтовые, так и однобайтовые буферы приемлемы (в многобайтовом случае, значения байтов должны быть представлены в виде восьмибитных символов). Обычно декодированный текст заменяет исходный текст в буфере, но необязательный аргумент destination может изменить это. Если destination — это буфер, декодированный текст вставляется в этот буфер после точки (точка не перемещается); если это t, команда возвращает декодированный текст как многобайтовую строку, не вставляя его.

Если декодированный текст вставляется в какой-либо буфер, эта команда возвращает длину декодированного текста. Если этот буфер является однобайтовым буфером (см. Выбор представления), внутреннее представление декодированного текста (см. Представления текста) вставляется в буфер в виде отдельных байтов.

Эта команда помещает свойство текста charset на декодированный текст. Значение свойства указывает кодовую страницу, используемую для декодирования исходного текста.

Эта команда обнаруживает кодировку текста, если это необходимо. Если coding-system равно undecided, команда обнаруживает кодировку текста на основе последовательностей байтов, которые она находит в тексте, а также определяет тип используемой в тексте конвенции конца строки (см. eol type). Если coding-system равно undecided-eol-type, где eol-type равно unix, dos, или mac, то команда обнаруживает только кодировку текста. Любая coding-system, которая не определяет eol-type, как в utf-8, заставляет команду обнаруживать конвенцию конца строки; полностью укажите кодирование, как в utf-8-unix, если конвенция EOL, используемая текстом, известна заранее, чтобы предотвратить любое автоматическое обнаружение.

Функция: decode-coding-string string coding-system &optional nocopy buffer

Эта функция декодирует текст в string в соответствии с coding-system. Она возвращает новую строку, содержащую декодированный текст, за исключением случаев, когда nocopy отлично от nil, в таком случае функция может вернуть саму string, если операция декодирования тривиальна. Чтобы сделать явное декодирование полезным, содержимое string должно быть однобайтовой строкой с последовательностью значений байтов, но также приемлема многобайтовая строка (при условии, что она содержит 8-битные байты в их многобайтовом формате).

Эта функция обнаруживает кодировку строки, если это необходимо, как и decode-coding-region.

Если необязательный аргумент buffer указывает буфер, декодированный текст вставляется в этот буфер после точки (точка не перемещается). В этом случае возвращаемое значение — длина декодированного текста. Если этот буфер является однобайтовым буфером, внутреннее представление декодированного текста вставляется в него в виде отдельных байтов.

Эта функция помещает свойство текста charset на декодированный текст. Значение свойства указывает кодовую страницу, используемую для декодирования исходного текста:

(decode-coding-string "Gr\374ss Gott" 'latin-1)
     ⇒ #("Grüss Gott" 0 9 (charset iso-8859-1))
Функция: decode-coding-inserted-region from to filename &optional visit beg end replace

Эта функция декодирует текст с from по to так, как будто он читается из файла filename с помощью insert-file-contents с использованием оставшихся предоставленных аргументов.

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

Copyright © 1990-1996, 1998-2022 Free Software Foundation, Inc.
Licensed under the GNU GPL license.
https://www.gnu.org/software/emacs/manual/html_node/elisp/Explicit-Encoding.html

Spec-Zone.ru

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