Все операции, которые передают текст в 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 в точную используемую систему кодирования.
Эта команда кодирует текст от start до end в соответствии с системой кодирования coding-system. Обычно закодированный текст заменяет исходный текст в буфере, но необязательный аргумент destination может это изменить. Если destination — это буфер, закодированный текст вставляется в этот буфер после точки (точка не перемещается); если это t, команда возвращает закодированный текст как однобайтовую строку без вставки.
Если закодированный текст вставляется в какой-либо буфер, эта команда возвращает длину закодированного текста.
Результат кодирования логически представляет собой последовательность байтов, но буфер остается многобайтовым, если он был многобайтовым до этого, и любые 8-битные байты преобразуются в их многобайтовое представление (см. Представления текста).
Не используйте undecided для coding-system при кодировании текста, так как это может привести к неожиданным результатам. Вместо этого используйте select-safe-coding-system (см. select-safe-coding-system) для предложения подходящего кодирования, если нет очевидного соответствующего значения для coding-system.
Эта функция кодирует текст в string в соответствии с системой кодирования coding-system. Она возвращает новую строку, содержащую закодированный текст, за исключением случаев, когда nocopy не равно nil, в этом случае функция может вернуть string саму, если операция кодирования тривиальна. Результат кодирования — это однобайтовая строка.
Эта команда декодирует текст от start до end в соответствии с системой кодирования coding-system. Чтобы явное декодирование было полезным, текст перед декодированием должен быть последовательностью байтовых значений, но приемлемы как многобайтовые, так и однобайтовые буферы (в многобайтовом случае необработанные байтовые значения должны быть представлены как восьмибитные символы). Обычно декодированный текст заменяет исходный текст в буфере, но необязательный аргумент destination может это изменить. Если destination — это буфер, декодированный текст вставляется в этот буфер после точки (точка не перемещается); если это t, команда возвращает декодированный текст как многобайтовую строку без вставки.
Если декодированный текст вставляется в какой-либо буфер, эта команда возвращает длину декодированного текста. Если этот буфер является однобайтовым буфером (см. Выбор представления), внутренняя репрезентация декодированного текста (см. Представления текста) вставляется в буфер как отдельные байты.
Эта команда устанавливает свойство текста charset на декодированный текст. Значение свойства указывает набор символов, использованный для декодирования исходного текста.
Эта команда обнаруживает кодирование текста, если это необходимо. Если coding-system равно undecided, команда обнаруживает кодирование текста на основе байтовых последовательностей, найденных в тексте, а также обнаруживает тип конвенции конца строки, используемой текстом (см. тип eol). Если coding-system равно undecided-eol-type, где eol-type равно unix, dos или mac, то команда обнаруживает только кодирование текста. Любая coding-system, которая не указывает eol-type, как, например, utf-8, заставляет команду обнаруживать конвенцию конца строки; полностью укажите кодирование, как в utf-8-unix, если конвенция EOL, используемая текстом, известна заранее, чтобы предотвратить любое автоматическое обнаружение.
Эта функция декодирует текст в 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))
Эта функция декодирует текст от from до to так, как если бы он читался из файла filename с использованием insert-file-contents с использованием оставшихся предоставленных аргументов.
Обычный способ использования этой функции — после чтения текста из файла без декодирования, если вы решите, что лучше его декодировать. Вместо удаления текста и повторного чтения его с декодированием вы можете вызвать эту функцию.