Как преобразовать восьмеричные последовательности в текст utf-8

9

Когда я копирую не-ascii текст из Windows и вставляю его в Emacs, он отображается в виде восьмеричной последовательности. Например, если я вставлю ä в Emacs, он отобразится как \ 344.

Я мог бы набрать Cq 344, чтобы вернуть ä в Emacs. Это раздражает, но терпимо, если есть только один персонаж. Но если есть много символов, превращенных в восьмеричные escape-последовательности, было бы удобно выполнить некоторую команду в регионе, чтобы преобразовать все внутри. Уже есть такая команда? Если нет, то как бы вы написали функцию для этого?

[Я установил систему кодирования по умолчанию на utf-8 в моем файле .emacs и использую один и тот же файл .emacs в Windows и Linux. Но проблема возникает только при копировании из приложения Windows в Emacs. Копирование из Emacs в другое приложение Windows работает нормально.]

Джон Д. Кук
источник
1
Я думаю, что вы хотите revert-buffer-with-coding-system(см. Документацию). Emacs показывает символы таким образом, потому что вы скопировали их из среды, которая была в другой системе кодирования (предполагая, что ANSI с так называемыми символами высокого ASCII, использованными для рендеринга латиницы с диакритическими знаками), но ваш буфер должен использовать что-то вроде UTF-8 (для какие символы ASCII с установленными старшими битами не имеют значения, то есть недопустимы).
wvxvw
1
Или, может быть, даже set-clipboard-coding-system. Попробуйте C-h a coding-systemпосмотреть, какие другие функции в этой группе доступны.
wvxvw
\ 344, который вы видите, является результатом проблемы конфигурации. Вместо команды «исправить» это после факта, вы должны выяснить, почему вы получаете это в первую очередь. Например , начать с , emacs -Qи если вы видите проблему там уже M-x report-emacs-bug.
Стефан
@ Stefan Иногда, «почему вы получаете это» очевидно, но это не поможет вам исправить это после факта. Например, у меня возникла эта проблема в результате insert-file-literally(и было слишком поздно либо отменить, либо удалить / заново вставить файл).
Т. Веррон
@Stefan может быть так много неверных конфигураций вне Emacs, что может привести к такому, например, к тому, что кто-то сохранил спецификацию в файл, который изначально был в какой-то однобайтовой кодировке cp-12XX, что запутало редактор исходного кода, из которого был скопирован текст, редактор исходного кода неверно сообщил о типе содержимого в буфере обмена и т. д. Я часто видел это при редактировании некоторых древних ASP-источников, которые изначально были неправильно закодированы.
wvxvw

Ответы:

4

Оказывается, оскорбительная часть моего файла .emacs была (set-selection-coding-system 'utf-8). Как только я удалил эту строку, Emacs вел себя как ожидалось.

Джон Д. Кук
источник
2

Однажды сделал это:

(defun umlaute ()
  "Fix wrongly inserted characters, commonly from pasting. "
  (interactive "*")
  (save-excursion
    (goto-char (point-min))
    (while (re-search-forward (concat "\\\344\\|"(list 228)) nil 1)
      (replace-match "ä"))
    (goto-char (point-min))
    (while (re-search-forward (concat "\\\304\\|"(list 196)) nil t 1)
      (replace-match "Ä"))
    (goto-char (point-min))
    (while (re-search-forward (concat "\\\366\\|"(list 246)) nil t 1)
      (replace-match "ö"))
    (goto-char (point-min))
    (while (re-search-forward (concat "\\\326\\|"(list 214)) nil t 1)
      (replace-match "Ö"))
    (goto-char (point-min))
    (while (re-search-forward (concat "\\\374\\|"(list 252)) nil t 1)
      (replace-match "ü"))
    (goto-char (point-min))
    (while (re-search-forward (concat "\\\334\\|"(list 220)) nil t 1)
      (replace-match "Ü"))
    (goto-char (point-min))
    (while (re-search-forward (concat "\\\337\\|"(list 223)) nil t 1)
      (replace-match "ß"))
    (goto-char (point-min))
    (while (re-search-forward "\\\201" nil t 1)
      (replace-match ""))))

от misc-utils.el по адресу https://launchpad.net/sx-emacs-werkstatt

Андреас Рёлер
источник