34.10.2 Кодирование и ввод/вывод

Основная цель систем кодирования — использование при чтении и записи файлов. Функция insert-file-contents использует систему кодирования для декодирования данных файла, а write-region использует ее для кодирования содержимого буфера.

Вы можете указать систему кодирования для использования либо явно (см. Указание системы кодирования для одной операции), либо неявно с помощью механизма по умолчанию (см. Системы кодирования по умолчанию). Однако эти методы могут не полностью определить, что делать. Например, они могут выбрать систему кодирования, такую как undecided, которая оставляет преобразование кодов символов для определения на основе данных. В таких случаях операция ввода/вывода завершает работу по выбору системы кодирования. Очень часто вы захотите узнать позже, какая система кодирования была выбрана.

Переменная: buffer-file-coding-system

Эта буферная переменная записывает систему кодирования, используемую для сохранения буфера и для записи части буфера с помощью write-region. Если текст, который необходимо записать, не может быть безопасно закодирован с использованием системы кодирования, указанной в этой переменной, эти операции выбирают альтернативное кодирование, вызывая функцию select-safe-coding-system (см. Системы кодирования, выбранные пользователем). Если выбор другого кодирования требует запроса у пользователя указания системы кодирования, buffer-file-coding-system обновляется до вновь выбранной системы кодирования.

buffer-file-coding-system не влияет на отправку текста в подпроцесс.

Переменная: save-buffer-coding-system

Эта переменная указывает систему кодирования для сохранения буфера (переопределяя buffer-file-coding-system). Обратите внимание, что она не используется для write-region.

Когда команда сохранения буфера начинает использовать buffer-file-coding-system (или save-buffer-coding-system), и эта система кодирования не может обработать фактический текст в буфере, команда просит пользователя выбрать другую систему кодирования (вызывая select-safe-coding-system). После этого команда также обновляет buffer-file-coding-system, чтобы отразить систему кодирования, указанную пользователем.

Переменная: last-coding-system-used

Операции ввода/вывода для файлов и подпроцессов устанавливают эту переменную в имя системы кодирования, которая была использована. Явные функции кодирования и декодирования (см. Явное кодирование и декодирование) также устанавливают ее.

Предупреждение: Поскольку получение вывода подпроцесса устанавливает эту переменную, она может измениться в любое время, когда Emacs ожидает; поэтому следует скопировать значение вскоре после вызова функции, которая сохраняет интересующее вас значение.

Переменная selection-coding-system указывает, как кодировать выделения для оконной системы. См. Выделения оконной системы.

Переменная: file-name-coding-system

Переменная file-name-coding-system указывает систему кодирования, используемую для кодирования имен файлов. Emacs кодирует имена файлов с использованием этой системы кодирования для всех операций с файлами. Если file-name-coding-system равно nil, Emacs использует системную систему кодирования по умолчанию, определяемую выбранной языковой средой. В системной среде по умолчанию любые символы, не являющиеся ASCII, в именах файлов не кодируются специально; они отображаются в файловой системе с использованием внутреннего представления Emacs.

Предупреждение: если вы измените file-name-coding-system (или языковую среду) в середине сеанса Emacs, могут возникнуть проблемы, если вы уже посещали файлы, имена которых были закодированы с использованием более ранней системы кодирования и обрабатываются по-разному в новой системе кодирования. Если вы попытаетесь сохранить один из этих буферов под посещенным именем файла, сохранение может использовать неверное имя файла или вызвать ошибку. Если возникает такая проблема, используйте C-x C-w, чтобы указать новое имя файла для этого буфера.

В Windows 2000 и новее Emacs по умолчанию использует API Unicode для передачи имен файлов в ОС, поэтому значение file-name-coding-system в значительной степени игнорируется. Приложения Lisp, которым необходимо кодировать или декодировать имена файлов на уровне Lisp, должны использовать систему кодирования utf-8, когда system-type равно windows-nt; преобразование имен файлов, закодированных в UTF-8, в кодировку, подходящую для связи с ОС, выполняется внутренне Emacs.