Spec-Zone.ru › Elisp

Представления текста

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

Для поддержки этого множества символов и алфавитов Emacs строго следует стандарту Юникод. Стандарт Юникод присваивает уникальное число, называемое кодовой точкой, каждому символу. Диапазон кодовых точек, определенных Юникодом, или пространство кодов Юникода, составляет 0..#x10FFFF (в шестнадцатеричном представлении), включительно. Emacs расширяет этот диапазон кодовыми точками в диапазоне #x110000..#x3FFFFF, которые он использует для представления символов, не объединённых с Юникодом, и сырых байтов 8-битной кодировки, которые нельзя интерпретировать как символы. Таким образом, кодовая точка символа в Emacs является 22-битным целым числом.

Для экономии памяти Emacs не хранит фиксированные 22-битные числа, которые являются кодовыми точками символов текста в буферах и строках. Вместо этого Emacs использует переменную длину внутреннего представления символов, храня каждого символ как последовательность от 1 до 5 8-битных байтов, в зависимости от величины его кодовой точки20. Например, любой символ ASCII занимает только 1 байт, символ Latin-1 занимает 2 байта и т. д. Мы называем это представление текста многобайтовым.

Вне Emacs символы могут быть представлены во многих разных кодировках, таких как ISO-8859-1, GB-2312, Big-5 и т. д. Emacs преобразует между этими внешними кодировками и своим внутренним представлением при чтении текста в буфер или строку или при записи текста в файл на диске или передаче его другому процессу.

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

Закодированный текст, с точки зрения Emacs, на самом деле не является текстом, а последовательностью сырых 8-битных байтов. Мы называем буферы и строки, которые хранят закодированный текст, однобайтовыми буферами и строками, потому что Emacs обрабатывает их как последовательность отдельных байтов. Обычно Emacs отображает однобайтовые буферы и строки как восьмеричные коды, такие как \237. Мы рекомендуем никогда не использовать однобайтовые буферы и строки, кроме как для обработки закодированного текста или двоичных данных, не являющихся текстом.

В буфере локальное значение переменной enable-multibyte-characters указывает используемое представление. Представление для строки определяется и записывается в строке при её создании.

Переменная: enable-multibyte-characters

Эта переменная указывает текущее представление текста буфера. Если она имеет ненулевое значение, буфер содержит многобайтовый текст; в противном случае, он содержит однобайтовый закодированный текст или двоичные данные, не являющиеся текстом.

Вы не можете установить эту переменную напрямую; вместо этого используйте функцию set-buffer-multibyte, чтобы изменить представление буфера.

Функция: position-bytes position

Позиции буфера измеряются в единицах символов. Эта функция возвращает позицию в байтах, соответствующую позиции буфера position в текущем буфере. Она равна 1 в начале буфера и увеличивается на 1 байт при переходе к следующему.

Если position находится вне допустимого диапазона, значение равно nil.

Функция: byte-to-position byte-position

Возвращает позицию буфера в единицах символов, соответствующую заданной byte-position в текущем буфере. Если byte-position находится вне допустимого диапазона, значение равно nil.

В многобайтовом буфере произвольное значение byte-position может находиться не на границе символа, а внутри многобайтовой последовательности, представляющей один символ; в этом случае эта функция возвращает позицию буфера символа, многобайтовая последовательность которого включает byte-position. Другими словами, значение не изменяется для всех позиций байтов, принадлежащих одному символу.

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

Функция: bufferpos-to-filepos position &optional quality coding-system

Эта функция аналогична position-bytes, но вместо байтовой позиции в текущем буфере она возвращает смещение от начала файла текущего буфера байта, соответствующего данному символу position в буфере. Преобразование требует знания того, как текст закодирован в файле буфера; для этого предназначен аргумент coding-system, по умолчанию принимающий значение buffer-file-coding-system. Необязательный аргумент quality указывает, насколько точным должен быть результат; он должен быть одним из следующих:

exact

Результат должен быть точным. Функции может потребоваться закодировать и декодировать большую часть буфера, что является дорогостоящим и может быть медленным.

approximate

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

nil

Если для получения точного результата требуются дорогостоящие вычисления, функция вернёт nil, а не приближение. Это значение по умолчанию, если аргумент опущен.

Функция: filepos-to-bufferpos byte &optional quality coding-system

Эта функция возвращает позицию буфера, соответствующую позиции файла, указанной byte, смещению в байтах от начала файла. Функция выполняет преобразование, обратное тому, что делает bufferpos-to-filepos. Необязательные аргументы quality и coding-system имеют то же значение и те же значения, что и для bufferpos-to-filepos.

Функция: multibyte-string-p string

Возвращает t если string является многобайтовой строкой, nil в противном случае. Функция также возвращает nil если string является объектом, отличным от строки.

Функция: string-bytes string

Эта функция возвращает количество байтов в string. Если string является многобайтовой строкой, это значение может быть больше (length string).

Функция: unibyte-string &rest bytes

Эта функция конкатенирует все свои аргументы bytes и делает результат однобайтовой строкой.

Copyright © 1990-1996, 1998-2022 Free Software Foundation, Inc.
Licensed under the GNU GPL license.
https://www.gnu.org/software/emacs/manual/html_node/elisp/Text-Representations.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API