Системы кодирования по умолчанию
В этом разделе описываются переменные, задающие систему кодирования по умолчанию для определённых файлов или при запуске определённых подпрограмм, а также функция, используемая операциями ввода-вывода для доступа к ним.
Предполагается, что вы задаёте эти переменные один раз и навсегда, устанавливая нужные вам значения по умолчанию, а затем больше их не меняете. Чтобы задать определённую систему кодирования для отдельной операции в программе на Lisp, не меняйте эти переменные; вместо этого переопределите их с помощью coding-system-for-read и coding-system-for-write (см. раздел Задание системы кодирования для одной операции).
- Пользовательский параметр: auto-coding-regexp-alist
Эта переменная представляет собой alist текстовых шаблонов и соответствующих систем кодирования. Каждый элемент имеет вид
(regexp . coding-system); файл, первые несколько килобайт которого соответствуют regexp, декодируется с помощью coding-system при чтении его содержимого в буфер. Настройки в этом alist имеют приоритет над тегамиcoding:в файлах и содержимымfile-coding-system-alist(см. ниже). Значение по умолчанию задано так, чтобы Emacs автоматически распознавал почтовые файлы в формате Babyl и читал их без преобразования кодировки.
- Пользовательский параметр: file-coding-system-alist
-
Эта переменная представляет собой alist, задающий системы кодирования, которые следует использовать для чтения и записи определённых файлов. Каждый элемент имеет вид
(pattern . coding), где pattern — регулярное выражение, соответствующее некоторым именам файлов. Элемент применяется к именам файлов, соответствующим pattern.CDR элемента, coding, должен быть системой кодирования, cons-ячейкой, содержащей две системы кодирования, или именем функции (символом с определением функции). Если coding — система кодирования, она используется как для чтения файла, так и для его записи. Если coding — cons-ячейка, содержащая две системы кодирования, её CAR задаёт систему кодирования для декодирования, а CDR — систему кодирования для кодирования.
Если coding — имя функции, функция должна принимать один аргумент — список всех аргументов, переданных в
find-operation-coding-system. Она должна возвращать систему кодирования или cons-ячейку, содержащую две системы кодирования. Это значение имеет описанный выше смысл.Если coding (или значение, возвращённое указанной выше функцией) —
undecided, выполняется обычное автоматическое определение кодировки.
- Пользовательский параметр: auto-coding-alist
Эта переменная представляет собой alist, задающий системы кодирования, которые следует использовать для чтения и записи определённых файлов. Она имеет ту же форму, что и
file-coding-system-alist, но, в отличие от последней, эта переменная имеет приоритет над любыми тегамиcoding:в файле.
- Переменная: process-coding-system-alist
Эта переменная представляет собой alist, указывающий, какие системы кодирования использовать для подпроцесса в зависимости от того, какая программа в нём выполняется. Она работает как
file-coding-system-alist, за исключением того, что pattern сравнивается с именем программы, используемым для запуска подпроцесса. Указанная в этом alist система или системы кодирования используются для инициализации систем кодирования, применяемых при вводе-выводе с подпроцессом, но позднее можно указать другие системы кодирования с помощьюset-process-coding-system.
Предупреждение: Системы кодирования, такие как undecided, определяющие систему кодирования на основе данных, не вполне надёжно работают с асинхронным выводом подпроцессов. Это связано с тем, что Emacs обрабатывает асинхронный вывод подпроцессов пакетами по мере их поступления. Если система кодирования не задаёт преобразование кодов символов или преобразование конца строки, Emacs должен пытаться определить правильное преобразование для каждого пакета отдельно, и это не всегда работает.
Поэтому для асинхронного подпроцесса по возможности используйте систему кодирования, которая задаёт и преобразование кодов символов, и преобразование конца строки, то есть такую, как latin-1-unix, а не undecided или latin-1.
- Переменная: network-coding-system-alist
Эта переменная представляет собой alist, задающий систему кодирования для сетевых потоков. Она работает почти так же, как
file-coding-system-alist, с той разницей, что pattern в элементе может быть либо номером порта, либо регулярным выражением. Если это регулярное выражение, оно сравнивается с именем сетевой службы, используемым для открытия сетевого потока.
- Переменная: default-process-coding-system
-
Эта переменная задаёт системы кодирования для ввода и вывода подпроцессов (и сетевых потоков), если ничто другое не указывает, что следует делать.
Значение должно быть cons-ячейкой вида
(input-coding . output-coding). Здесь input-coding применяется к вводу из подпроцесса, а output-coding — к выводу в него.
- Пользовательский параметр: auto-coding-functions
-
Эта переменная содержит список функций, которые пытаются определить систему кодирования файла на основе его ещё не декодированного содержимого.
Каждая функция в этом списке должна анализировать текст в текущем буфере, но не должна каким-либо образом его изменять. Буфер будет содержать текст частей файла. Каждая функция должна принимать один аргумент — size, указывающий, сколько символов, начиная с точки, следует просмотреть. Если функции удаётся определить систему кодирования файла, она должна вернуть эту систему кодирования. В противном случае она должна вернуть
nil. Каждая функция также может получить имя файла, которому принадлежит содержимое буфера, из переменнойauto-coding-file-name.Функции из этого списка могут вызываться при посещении файла, когда Emacs нужно декодировать его содержимое, и/или перед сохранением буфера файла, когда Emacs нужно определить, как закодировать его содержимое.
Если файл содержит тег ‘coding:’, он имеет приоритет, поэтому эти функции вызваны не будут.
- Функция: find-auto-coding filename size
-
Эта функция пытается определить подходящую систему кодирования для filename. Она проверяет буфер, посещающий файл с указанным именем, последовательно используя описанные выше переменные, пока не найдёт соответствие одному из заданных ими правил. Затем она возвращает cons-ячейку вида
(coding . source), где coding — используемая система кодирования, а source — один из символовauto-coding-alist,auto-coding-regexp-alist,:codingилиauto-coding-functions, указывающий, какая переменная задала соответствующее правило. Значение:codingозначает, что система кодирования была задана тегомcoding:в файле (см. раздел тег coding в руководстве The GNU Emacs Manual). Правила проверяются в следующем порядке: сначалаauto-coding-alist, затемauto-coding-regexp-alist, потом тегcoding:и, наконец,auto-coding-functions. Если соответствующее правило не найдено, функция возвращаетnil.Второй аргумент size задаёт размер текста в символах после точки. Функция проверяет текст только в пределах size символов после точки. Обычно при вызове этой функции буфер должен быть установлен в начало, поскольку тег
coding:может находиться в одной или двух первых строках файла; в этом случае size должен быть равен размеру буфера.
- Функция: set-auto-coding filename size
Эта функция возвращает подходящую систему кодирования для файла filename. Для определения системы кодирования она использует
find-auto-coding. Если определить систему кодирования не удалось, функция возвращаетnil. Аргумент size имеет тот же смысл, что и вfind-auto-coding.
- Функция: find-operation-coding-system operation &rest arguments
-
Эта функция возвращает систему кодирования, используемую (по умолчанию) для выполнения operation с аргументами arguments. Значение имеет следующий вид:
(decoding-system . encoding-system)
Первый элемент, decoding-system, — это система кодирования для декодирования (если operation выполняет декодирование), а encoding-system — система кодирования для кодирования (если operation выполняет кодирование).
Аргумент operation — символ; он должен быть одним из
write-region,start-process,call-process,call-process-region,insert-file-contentsилиopen-network-stream. Это имена примитивов ввода-вывода Emacs, способных выполнять преобразование кодов символов и преобразование конца строки.Остальные аргументы должны совпадать с аргументами, которые могут передаваться соответствующему примитиву ввода-вывода. В зависимости от примитива один из этих аргументов выбирается в качестве цели. Например, если operation выполняет файловый ввод-вывод, целью становится аргумент, задающий имя файла. Для примитивов подпроцессов целью является имя процесса. Для
open-network-streamцелью служит имя службы или номер порта.В зависимости от operation эта функция ищет цель в
file-coding-system-alist,process-coding-system-alistилиnetwork-coding-system-alist. Если цель найдена в alist,find-operation-coding-systemвозвращает соответствующую ей ассоциацию в alist; в противном случае функция возвращаетnil.Если operation —
insert-file-contents, аргумент, соответствующий цели, может быть cons-ячейкой вида(filename . buffer). В этом случае filename — имя файла для поиска вfile-coding-system-alist, а buffer — буфер, содержащий содержимое файла (ещё не декодированное). Еслиfile-coding-system-alistуказывает функцию, которую нужно вызвать для этого файла, и этой функции требуется просмотреть содержимое файла (как это обычно бывает), ей следует анализировать содержимое buffer, а не читать файл.
Copyright © 1990-1996, 1998-2026 Free Software Foundation, Inc.
Licensed under the GNU GPL license.
https://www.gnu.org/software/emacs/manual/html_node/elisp/Default-Coding-Systems.html