34.10.6 Указание системы кодирования для одной операции

Вы можете указать систему кодирования для определенной операции, привязав переменные coding-system-for-read и/или coding-system-for-write.

Переменная: coding-system-for-read

Если эта переменная не равна nil, она указывает систему кодирования, которую следует использовать для чтения файла или для ввода из синхронного подпроцесса.

Она также применяется к любому асинхронному подпроцессу или сетевому потоку, но по-другому: значение coding-system-for-read при запуске подпроцесса или открытии сетевого потока определяет метод декодирования ввода для этого подпроцесса или сетевого потока. Она остается в силе для этого подпроцесса или сетевого потока, если не будет переопределена.

Правильный способ использования этой переменной — привязать ее с помощью let для конкретной операции ввода-вывода. Ее глобальное значение по умолчанию nil, и вы не должны устанавливать ее глобально в какое-либо другое значение. Вот пример правильного использования этой переменной:

;; Прочитать файл без преобразования кодовой страницы.
(let ((coding-system-for-read 'no-conversion))
  (insert-file-contents filename))

Когда ее значение не равно nil, эта переменная имеет приоритет над всеми другими методами указания системы кодирования для ввода, включая file-coding-system-alist, process-coding-system-alist и network-coding-system-alist.

Переменная: coding-system-for-write

Это работает очень похоже на coding-system-for-read, за исключением того, что это относится к выводу, а не к вводу. Это влияет на запись в файлы, а также на отправку вывода в подпроцессы и сетевые соединения. Это также применяется к кодированию аргументов командной строки, с помощью которых Emacs вызывает подпроцессы.

Когда одна операция выполняет как ввод, так и вывод, как call-process-region и start-process, влияют на нее как coding-system-for-read, так и coding-system-for-write.

Переменная: coding-system-require-warning

Привязка coding-system-for-write к значению, отличному от nil, предотвращает вызов примитива вывода функции, указанной в select-safe-coding-system-function (см. Системы кодирования, выбранные пользователем). Это связано с тем, что C-x RET c (universal-coding-system-argument) работает путем привязки coding-system-for-write, и Emacs должен подчиняться выбору пользователя. Если программа Lisp привязывает coding-system-for-write к значению, которое может быть небезопасным для кодирования текста, который будет записан, она также может привязать coding-system-require-warning к значению, отличному от nil, что заставит примитивы вывода проверять кодирование, вызывая значение select-safe-coding-system-function, даже если coding-system-for-write не равно nil. В качестве альтернативы явно вызовите select-safe-coding-system перед использованием указанного кодирования.

Опция пользователя: inhibit-eol-conversion

Когда эта переменная не равна nil, не выполняется преобразование конца строки, независимо от указанной системы кодирования. Это применимо ко всем примитивам ввода-вывода Emacs и подпроцессов, а также к функциям явного кодирования и декодирования (см. Явное кодирование и декодирование).

Иногда вам нужно отдать предпочтение нескольким системам кодирования для какой-либо операции, а не фиксировать одну. Emacs позволяет указать порядок приоритета для использования систем кодирования. Этот порядок влияет на сортировку списков систем кодирования, возвращаемых такими функциями, как find-coding-systems-region (см. Системы кодирования в Lisp).

Функция: coding-system-priority-list &optional highestp

Эта функция возвращает список систем кодирования в порядке их текущего приоритета. Необязательный аргумент highestp, если он не равен nil, означает возврат только системы кодирования с наивысшим приоритетом.

Функция: set-coding-system-priority &rest coding-systems

Эта функция помещает coding-systems в начало списка приоритетов систем кодирования, тем самым повышая их приоритет по сравнению со всеми остальными.

Макрос: with-coding-priority coding-systems &rest body

Этот макрос выполняет body, как это делает progn (см. progn), с coding-systems в начале списка приоритетов систем кодирования. coding-systems должен быть списком систем кодирования, которые следует предпочесть во время выполнения body.