Поддержка разных языков – ЧАСТЬ 3

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

2  Оно также предписано для тел MIME  ‘text/*’ и других контекстов пересылки по сети. Это отличается от формата синтаксиса ссылок SGML  начало-записи/конец-записи,  который  Emacs не  поддерживает напрямую.

Список приоритетов систем кодирования зависит от выбранной языковой среды (см. Раздел 18.3 [Языковые среды], с. 162). Например, если вы используете французский, вы, вероятно, захотите,  чтобы Emacs предпочитал Latin-1, а не Latin-2; а если вы используете чешский — чтобы предпочтение  отдавалось Latin-2.   Это одна из причин задавать языковую среду.

Однако, вы можете  детально изменять список приоритетов с помощью команды M-x prefer-coding-system. Эта команда считывает имя системы кодирования в минибуфере и добавляет  ее в начало списка приоритетов, так, чтобы ей отдавалось предпочтение  среди остальных. Если вы применяете эту команду несколько раз, при каждом использовании в начало списка приоритетов добавляется один элемент.

Если вы используете систему кодирования, которая определяет тип преобразования последовательности конец-строки, такую  как iso-8859-1-dos, то это означает, что Emacs должен попытаться распознать предпочтительно iso-8859-1 и использовать преобразование конца-строки DOS, если iso-8859-1 была распознана.

Иногда имя файла указывает на то, какая система кодирования должна для него использоваться. Это соответствие задает переменная file-coding-system-alist.  Для добавления элементов к этому списку есть особая функция, modify-coding-system-alist. К примеру, чтобы все ‘.txt’-файлы считывались и записывались с использованием системы кодирования china-iso-8bit, вы можете выполнить следующее лисповское выражение:

(modify-coding-system-alist ’file "\\.txt\\’" ’china-iso-8bit)

Первым аргументом должен быть file, вторым — регулярное выражение, определяющее, к каким файлам это относится, а третий аргумент говорит,  какую систему кодирования применять для этих файлов.

Emacs узнаёт, какой вид преобразования конца-строки следует использовать, основываясь на содержимом  файла: если он видит только возвраты каретки или только последовательности возврат каретки-перевод строки, то выбирает соответствующее преобразование. Вы можете подавить автоматическое использование преобразования конца-строки, установив переменную inhibit-eol-conversion в значение nil.

Вы можете указать систему кодирования для конкретного файла, применяя  конструкцию ‘-*-…-*-’  в начале этого файла или в списке локальных переменных в его конце (см.  Раздел 31.2.5 [Переменные  файла], с. 351). Вы делаете это, определяя значение для “переменной” с именем coding.   На самом деле  в Emacs нет переменной coding;  вместо установки переменной  он использует заданную систему кодирования для этого файла. Например, ‘-*-mode: C; coding: latin-1;-*-’ велит использовать  систему кодирования Latin-1 и режим C. Если вы явно указали систему кодирования в файле, она перекрывает file-coding-system-alist.

Переменная auto-coding-alist — это самый сильный способ указать систему кодиро-

вания для определенных  образцов имен файлов;  эта переменная даже  перекрывает теги

‘-*-coding:-*-’ в самом файле. Emacs использует  это средство для tar-файлов и архивов, чтобы избежать  ошибочной интерпретации тега ‘-*-coding:-*-’ в элементе архива как относящегося ко всему архивному файлу.

Когда Emacs выбрал систему кодирования для буфера, он сохраняет  ее в buffer-filecoding-system  и по умолчанию использует эту систему кодирования для операций, которые записывают этот буфер  в файл.  Это включает команды save-buffer  и writeregion.   Если вы хотите  записывать файлы из этого буфера, используя  другую систему кодирования, вы можете указать для этого файла новую систему кодирования с помощью set-buffer-file-coding-system (см. Раздел 18.9 [Задание кодирования], с. 168).

Когда  вы посылаете сообщение с помощью режима Mail (см.  Глава 26 [Посылка почты], с. 267), у Emacs есть четыре разных способа узнать систему кодирования для текста сообщения.  Он пробует значение buffer-file-coding-system, собственное для этого буфера, если оно не равно nil. Иначе, он использует значение sendmail-coding-system, если

оно не равно nil.  Третий способ — использовать систему кодирования, принимаемую по умолчанию для новых файлов, которая управляется вашей языковой средой, если она не nil.  Если все три эти значения равны nil, Emacs кодирует исходящую почту, используя систему кодирования Latin-1.

Когда вы получаете новую почту в Rmail, каждое сообщение автоматически переводится из той системы кодирования, в которой оно было написано — как если бы оно было отдельным файлом. При этом используется заданный вами список приоритетов систем кодирования. Если в сообщении в формате MIME  указан набор знаков, Rmail подчиняется этому указанию, если rmail-decode-mime-charset не равна nil.

Для считывания и сохранения самих Rmail-файлов Emacs использует систему кодирования, задаваемую переменной rmail-file-coding-system. Значение по умолчанию равно nil,  что означает, что Rmail-файлы  не переводятся (они считываются и сохраняются во внутренней кодировке Emacs).

18.9  Задание  системы кодирования

В случаях, когда Emacs не может автоматически подобрать правильную систему коди-

рования, вы можете указать ее явно с помощью таких команд:

C-x hRETf кодирование hRETi

Использовать систему кодирования кодирование для файла, к которому обра-

щается текущий буфер.

C-x hRETc кодирование hRETi

Задает систему кодирования кодирование для непосредственно следующей ко-

манды.

C-x hRETk кодирование hRETi

Использовать систему кодирования кодирование для ввода с клавиатуры.

C-x hRETt кодирование hRETi

Использовать систему кодирования кодирование для вывода на терминал.

C-x hRETp кодввода hRETкодвывода hRETi

Использовать системы кодирования кодввода и кодвывода для ввода и вывода подпроцесса текущего буфера.

C-x hRETx кодирование hRETi

Использовать систему кодирования кодирование для передачи выделений дру-

гим программам и получения их из других программ через оконную систему.

C-x hRETX кодирование hRETi

Использовать систему кодирования кодирование  для передачи или получения

одного выделения — следующего — в оконную систему или из нее.

Команда C-x hRETf (set-buffer-file-coding-system)  задает систему кодирования файла  для текущего буфера  — другими словами, указывает, какую  систему кодирования следует использовать  для сохранения или повторного считывания этого файла. Вы задаете систему кодирования в минибуфере.  Так как эта команда применяется только к файлу, к которому вы уже обратились, она влияет лишь на способ сохранения этого файла.

Другой способ указать систему кодирования для файла — сделать это во время обращения. Сначала используйте команду C-x hRETc (universal-coding-system-argument); эта команда считывает в минибуфере имя системы кодирования. После выхода из минибуфера заданная система кодирования применяется для непосредственно  следующей команды.

Таким образом, если непосредственно следующей командой будет, скажем, C-x C-f,  то она считает файл, используя  указанную систему кодирования (и запоминает эту систему

кодирования для последующей записи файла). Или, если следующей командой будет C-x C-w, она запишет файл, используя эту систему кодирования. Другие команды работы с файлами, на которые действует заданная система кодирования, включают C-x C-i  и C-x C-v, а также варианты C-x C-f с показом в другом окне.

C-x hRETc также влияет на программы, начинающие подпроцессы, включая M-x shell

(см. Раздел 30.2 [Оболочка],  с. 323).

Однако, если непосредственно следующая команда не использует  систему кодирования,

то C-x hRETc в результате не имеет эффекта.

Простой способ обратиться к  файлу без преобразования предоставляет  команда M-x find-file-literally. См. Раздел 14.2 [Обращение], с. 106.

Переменная default-buffer-file-coding-system определяет выбор системы кодирования для вновь создаваемых файлов. Она применяется,  когда вы обращаетесь к новому файлу или создаете буфер и затем сохраняете его в файл. При выборе языковой среды эта переменная как правило устанавливается в подходящее значение по умолчанию.

Команда C-x hRETt (set-terminal-coding-system) задает систему кодирования для терминального вывода. Если вы зададите систему кодирования для терминального вывода, все выводимые  на терминал знаки переводятся в эту систему.

Это средство полезно для некоторых текстовых терминалов,  сделанных с поддержкой какого-то  конкретного языка или набора знаков — например, европейских терминалов, поддерживающих один из наборов знаков ISO Latin.   При использовании многобайтного текста вам нужно  указать систему кодирования, чтобы Emacs знал, какие знаки этот терминал может на самом деле обработать.

По умолчанию вывод на терминал не преобразуется  совсем, если только Emacs не может предугадать правильную систему кодирования для вашего типа терминала.

Команда C-x hRETk (set-keyboard-coding-system) задает систему кодирования для ввода с клавиатуры. Перевод кодов вводимых с клавиатуры знаков полезен для терминалов, клавиши которых посылают графические не-ASCII-знаки,  например, для некоторых терминалов, разработанных для кодировки ISO Latin-1 или ее подмножеств.

По умолчанию  ввод с клавиатуры не переводится.

Между использованием системы кодирования для перевода ввода с клавиатуры и использованием метода ввода есть некое сходство: в обоих случаях определяются вводимые с клавиатуры последовательности,  превращающиеся  с один знак.  Однако, методы ввода разработаны для удобного интерактивного использования людьми, и переводимые ими последовательности обычно являются последовательностями печатных ASCII-знаков. Системы кодирования как правило переводят последовательности неграфических знаков.

Команда C-x hRETx (set-selection-coding-system) задает систему кодирования для передачи выделенного  текста оконной системе  и для получения текста выделений,  сделанных в других  приложениях.  Эта команда относится ко всем будущим выделениям, пока вы не отмените это, снова применив эту команду.  Команда C-x hRETX (set-nextselection-coding-system) задает систему кодирования для следующего выделения, сделанного в Emacs или считанного Emacs.

Команда C-x hRETp (set-buffer-process-coding-system) задает систему кодирования для ввода и вывода подпроцесса.  Эта команда относится к текущему буферу; как правило, каждый подпроцесс имеет собственный  буфер, следовательно,  вы можете  указывать перекодировку  ввода и вывода процесса, давая эту команду в соответствующем буфере.

По умолчанию  ввод и вывод процессов не переводится совсем.

Переменная file-name-coding-system задает систему кодирования, используемую для кодирования имен файлов. Если вы установите  ее  равной имени системы кодирования (это лисповский символ или строка), Emacs станет кодировать имена файлов  при всех файловых операциях, используя эту систему кодирования. Это позволяет использовать в

именах файлов не-ASCII-знаки,  или по крайней мере те  не-ASCII-знаки,  которые могут быть закодированы текущей системой кодирования.

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

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

18.10  Наборы шрифтов

Шрифт X Windows обычно определяет начертание  для одного алфавита или письменности.  Поэтому для отображения полного спектра всех систем письма, которые поддерживает Emacs, необходимо  множество шрифтов.  В Emacs такое множество называется набором шрифтов. Набор шрифтов определяется как список шрифтов, каждый из которых предназначается для работы с одним диапазоном кодов знаков.

Каждый набор шрифтов имеет имя, как и отдельный шрифт. Доступные шрифты определяются X-сервером; наборы шрифтов определяются внутри самого Emacs. Как  только вы определили набор шрифтов, вы можете использовать его в Emacs, указывая его имя в любом контексте,  где вы могли бы написать один шрифт.  Разумеется, наборы шрифтов Emacs могут  содержать только те  шрифты, которые поддерживаются X-сервером;  если некоторые знаки появляются на экране как пустые прямоугольники, это означает, что в используемом наборе шрифтов нет шрифта для этих знаков.

Emacs создает два набора шрифтов автоматически:  стандартный набор шрифтов и стартовый набор шрифтов. Стандартный набор шрифтов скорее всего содержит шрифты для широкого спектра знаков, не входящих  в ASCII; однако, по умолчанию Emacs использует не его.  (По умолчанию Emacs старается найти шрифт, которые имеет жирный и курсивный варианты.)  Вы можете указать, что нужно использовать стандартный набор шрифтов, с помощью ключа ‘-fn’ или с помощью X-ресурса ‘Font’ (см. Раздел A.7 [Шрифт X], с. 392). Например,

emacs  -fn fontset-standard

Набор шрифтов не обязан задавать шрифт для каждого кода. Если набор шрифтов не определяет шрифт для некоторого знака, или его он определяет шрифт, которого нет в вашей системе, то он не может правильно отобразить этот знак. Вместо этого знака будет показан пустой прямоугольник.

Высота и ширина набора шрифтов определяются ASCII-знаками (то есть шрифтами, используемыми в этом наборе для ASCII-знаков). Если другой шрифт в этом наборе имеет иную высоту или ширину, то знаки, приписанные к этому шрифту, обрезаются до размера набора шрифтов. Если highlight-wrong-size-font отлична от nil,  то вокруг знаков с неправильным  размером еще выводится  прямоугольник.

18.11  Определение наборов  шрифтов

Emacs создает стандартный набор шрифтов автоматически в соответствии с standardfontset-spec. Именем этого набора является

-*-fixed-medium-r-normal-*-16-*-*-*-*-*-fontset-standard

или просто ‘fontset-standard’ для краткости.

Жирный,  курсивный и жирный курсивный варианты стандартного набора шрифтов создаются автоматически. Их имена имеют ‘bold’  вместо ‘medium’, или ‘i’ вместо ‘r’ или и то, и другое.

Если вы задали ASCII-шрифт по умолчанию с помощью ресурса ‘Font’ или аргумента

‘-fn’, Emacs автоматически генерирует  из него набор шрифтов.  Это стартовый набор шрифтов, и его имя — fontset-startup. Emacs делает это, заменяя в имени шрифта поля foundry, family,  add style и average width  на ‘*’, заменяя charset registry на ‘fontset’, а поле charset encoding — на ‘startup’ и используя затем полученную строку для задания набора шрифтов.

К примеру, если вы запустили Emacs таким образом:

emacs  -fn "*courier-medium-r-normal-14-140-*-iso8859-1"

Emacs генерирует следующий набор шрифтов и использует его для первого фрейма:

-*-*-medium-r-normal-*-14-140-*-*-*-*-fontset-startup

В X-ресурсе ‘Emacs.Font’ вы можете  указывать набор шрифтов, точно так же,  как и обычное имя шрифта.  Но будьте  внимательны и не задавайте  набор шрифтов в ресурсе с символами подстановки, как ‘Emacs*Font’, — такая спецификация применяется для различных целей, например для меню, а меню не может обращаться с наборами шрифтов.

Вы можете определить дополнительные наборы шрифтов, используя X-ресурсы с именами ‘Fontset-n’, где n — число, отсчитываемое от нуля. Значение этого ресурса должно иметь такую форму:

шаблоншрифта,  [имякодировки:имяшрифта]. . .

шаблоншрифта, кроме  двух последних полей, должен иметь форму стандартного имени

X-шрифта. Два последних поля должны иметь вид ‘fontset-псевдоним’.

У набора шрифтов есть два имени, одно длинное, а другое короткое. Длинное имя — это шаблоншрифта. Короткое имя — это ‘fontset-псевдоним’. Вы можете ссылаться на набор шрифтов по любому из этих имен.

Конструкция  ‘кодировка:шрифт’  определяет,  какой шрифт должен использоваться (в этом наборе) для одного конкретного набора знаков. Здесь кодировка — это имя набора знаков, а шрифт — это используемый для него шрифт.  При определении одного набора шрифтов вы можете применять эту конструкцию любое число раз.

Для  остальных наборов знаков Emacs выбирает шрифт,  основываясь  на шаблонешрифта. Он заменяет ‘fontset-псевдоним’ на значения, описывающие набор знаков. Для шрифта знаков ASCII, ‘fontset-псевдоним’ заменяется на ‘ISO8859-1’.

Кроме того, когда несколько последовательных полей являются символами подстановки, Emacs сжимает их в один символ. Это делается для предотвращения использования автоматически масштабированных шрифтов. Шрифты, получаемые масштабированием более крупного шрифта, непригодны для редактирования, а масштабирование мелкого шрифта бессмысленно, потому что мелкий шрифт лучше использовать с его собственным размером, что Emacs и делает.

Таким образом, если шаблоншрифта  задан так:

-*-fixed-medium-r-normal-*-24-*-*-*-*-*-fontset-24

то спецификация шрифта для ASCII-знаков была бы такой:

-*-fixed-medium-r-normal-*-24-*-ISO8859-1

а спецификация шрифта для китайских знаков GB2312 такой:

-*-fixed-medium-r-normal-*-24-*-gb2312*-*

У  вас может не оказаться китайских  шрифтов, соответствующих приведенной выше спецификации.  Большинство дистрибутивов X  Windows включают  только  китайские

шрифты с ‘song ti’  или ‘fangsong ti’  в поле family.   В таком случае ‘Fontset-n’ мож-

но задать таким образом:

Emacs.Fontset-0: -*-fixed-medium-r-normal-*-24-*-*-*-*-*-fontset-24,\

chinese-gb2312:-*-*-medium-r-normal-*-24-*-gb2312*-*

Тогда спецификации  всех шрифтов, кроме китайских GB2312, будут иметь ‘fixed’ в поле family, а спецификации для китайских знаков GB2312 несут в поле family символ подстановки ‘*’.

Функция, которая обрабатывает  значение ресурса, определяющего  набор шрифтов, и создает этот набор, называется create-fontset-from-fontset-spec.  Вы также  можете вызывать эту функцию явно, чтобы сгенерировать набор шрифтов.

См. Раздел A.7 [Шрифт X], с. 392, для большей информации об именовании шрифтов в

X.

18.12  Поддержка однобайтных европейских знаков

Наборы знаков ISO 8859 Latin-n определяют коды знаков в диапазоне от 160 до 255 для обращения с акцентированными буквами и знаками препинания, необходимыми в различных европейских языках.  Если вы выключите  поддержку многобайтных знаков, Emacs все же  сможет работать с одной из этих кодировок.  Чтобы указать, какие из этих кодов следует использовать, вызовите M-x set-language-environment и задайте подходящую языковую среду, такую как ‘Latin-n’.

Для получения большей информации  об однобайтном режиме  смотрите  Раздел 18.2 [Включение многобайтных знаков], с. 161.  В частности, обратите  внимание на то, что ваши файлы инициализации считываются как однобайтные, если они содержат не-ASCIIзнаки.

Emacs может также  отображать такие знаки, при условии, что они поддерживаются терминалом или шрифтом. Это работает автоматически. Или, если вы используете оконную систему, Emacs может отображать однобайтные знаки через наборы шрифтов, показывая в действительности эквивалентные многобайтные знаки в соответствии с языковой средой. Чтобы затребовать это, установите переменную unibyte-display-via-languageenvironment в отличное от nil значение.

Если ваш терминал не поддерживает набор знаков Latin-1, Emacs может отображать их как ASCII-последовательности, которые по крайней мере дают вам ясное представление  о том, что это за знаки. Чтобы сделать так, загрузите библиотеку iso-ascii.  Могут  быть реализованы похожие библиотеки и для других наборов знаков Latin-n, но пока их у нас нет.

Обычно не входящие  в ISO-8859 знаки (между 128 и 159 включительно) отображаются как восьмиричные управляющие последовательности. Вы можете изменить это для нестандартных ‘расширенных’ версий наборов знаков ISO-8859, используя функцию standarddisplay-8bit из библиотеки disp-table.

Есть три разных способа вводить однобайтные не-ASCII-знаки:

Если ваша клавиатура может генерировать коды знаков от 128 и выше, представляющие знаки, не входящие в ASCII, выполните следующее выражение, чтобы Emacs смог их понимать:

(set-input-mode  (car  (current-input-mode)) (nth 1  (current-input-mode))

0)

Вы можете использовать метод ввода для выбранной языковой среды. См. Раздел 18.4 [Методы ввода], с. 163.  Когда  вы используете  метод ввода в однобайтном  буфере, задаваемые с его помощью знаки переводятся в однобайтное представление.

Для ввода печатных знаков Latin-1 вы можете  использовать C-x 8 как префикс “составления”.  C-x 8 удобен для вставки (в минибуфере, а также в остальных буферах), для поиска и во всех других контекстах, где допускаются последовательности знаков.

C-x 8 работает путем загрузки библиотеки iso-transl.   Когда  эта библиотека загружена, клавиша-модификатор hALTi,  если она у вас есть, служит для той же цели, что и C-x 8; используйте hALTi  вместе со знаком акцента, чтобы модифицировать следующую букву.   Кроме  того,  если у вас есть залипающие клавиши для генерации акцентов Latin-1, то они тоже определены для компоновки со следующим знаком, если iso-transl загружена.

Источник: Ричард Столмен, Руководство по GNU Emacs

Похожие посты:

Вы можете оставить комментарий, или ссылку на Ваш сайт.

Оставить комментарий