Вы можете указать систему кодирования для определенной операции, привязав переменные coding-system-for-read и/или coding-system-for-write.
Если эта переменная не равна 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-read, за исключением того, что это относится к выводу, а не к вводу. Это влияет на запись в файлы, а также на отправку вывода в подпроцессы и сетевые соединения. Это также применяется к кодированию аргументов командной строки, с помощью которых Emacs вызывает подпроцессы.
Когда одна операция выполняет как ввод, так и вывод, как call-process-region и start-process, влияют на нее как coding-system-for-read, так и coding-system-for-write.
Привязка 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 перед использованием указанного кодирования.
Когда эта переменная не равна nil, не выполняется преобразование конца строки, независимо от указанной системы кодирования. Это применимо ко всем примитивам ввода-вывода Emacs и подпроцессов, а также к функциям явного кодирования и декодирования (см. Явное кодирование и декодирование).
Иногда вам нужно отдать предпочтение нескольким системам кодирования для какой-либо операции, а не фиксировать одну. Emacs позволяет указать порядок приоритета для использования систем кодирования. Этот порядок влияет на сортировку списков систем кодирования, возвращаемых такими функциями, как find-coding-systems-region (см. Системы кодирования в Lisp).
Эта функция возвращает список систем кодирования в порядке их текущего приоритета. Необязательный аргумент highestp, если он не равен nil, означает возврат только системы кодирования с наивысшим приоритетом.
Эта функция помещает coding-systems в начало списка приоритетов систем кодирования, тем самым повышая их приоритет по сравнению со всеми остальными.