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

Emacs может преобразовывать однобайтовый текст в многобайтовый; он также может преобразовывать многобайтовый текст в однобайтовый, при условии, что многобайтовый текст содержит только ASCII и сырые 8-битные байты. В общем случае, эти преобразования происходят при вставке текста в буфер или при объединении текста из нескольких строк в одну строку. Вы также можете явно преобразовать содержимое строки к любому из представлений.

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

При вставке текста в буфер Emacs преобразует текст к представлению буфера, указанному в этом буфере через enable-multibyte-characters. В особое случае, когда вы вставляете многобайтовый текст в однобайтовый буфер, Emacs преобразует текст в однобайтовый, хотя это преобразование в общем случае не может сохранить все символы, которые могут быть в многобайтовом тексте. Другая естественная альтернатива — преобразование содержимого буфера в многобайтовый формат — неприемлема, поскольку представление буфера является выбором, сделанным пользователем, который не может быть автоматически переопределен.

Преобразование однобайтового текста в многобайтовый оставляет символы ASCII без изменений и преобразует байты с кодами от 128 до 255 в многобайтовое представление сырых восьмибитных байтов.

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

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

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

Эта функция возвращает многобайтовую строку, содержащую ту же последовательность символов, что и string. Если string является многобайтовой строкой, она возвращается без изменений. Функция предполагает, что string содержит только символы ASCII и сырые 8-битные байты; последние преобразуются в их многобайтовое представление, соответствующее кодовым точкам #x3FFF80 по #x3FFFFF, включительно (см. кодовые точки).

Функция: string-to-unibyte string

Эта функция возвращает однобайтовую строку, содержащую ту же последовательность символов, что и string. Если string является однобайтовой строкой, она возвращается без изменений. В противном случае символы ASCII и символы в наборе eight-bit преобразуются в соответствующие им байтовые значения. Используйте эту функцию для аргументов string, содержащих только символы ASCII и восьмибитные символы; функция сигнализирует об ошибке, если встречаются любые другие символы.

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

Эта функция возвращает однобайтовую строку, содержащую один байт символьных данных, byte. Она сигнализирует об ошибке, если byte не является целым числом от 0 до 255.

Функция: multibyte-char-to-unibyte char

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

Функция: unibyte-char-to-multibyte char

Это преобразует однобайтовый символ char в многобайтовый символ, предполагая, что char является либо ASCII, либо сырым 8-битным байтом.