Представления текста
Буферы и строки 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