Явное кодирование и декодирование
Все операции, которые передают текст в 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