Cómo cambiar secuencias octales en texto utf-8

9

Cuando copio texto no ascii de Windows y lo pego en Emacs, aparece como una secuencia octal. Por ejemplo, si pego ä en Emacs, aparece como \ 344.

Podría escribir Cq 344 para recuperar el ä en Emacs. Eso es molesto, pero es tolerable si solo hay un personaje. Pero si hay muchos caracteres convertidos en secuencias de escape octal, sería conveniente ejecutar algún comando en una región para convertir todo lo que contiene. ¿Ya existe tal comando? Si no, ¿cómo escribirías una función para hacerlo?

[Configuré mi sistema de codificación predeterminado en utf-8 en mi archivo .emacs, y uso el mismo archivo .emacs en Windows y Linux. Pero el problema solo ocurre cuando se copia desde una aplicación de Windows a Emacs. Copiar de Emacs a otra aplicación de Windows funciona bien.]

John D. Cook
fuente
1
Creo que lo que quieres es revert-buffer-with-coding-system(ver su documentación). Emacs muestra los caracteres de esta manera porque los copió de un entorno que estaba en un sistema de codificación diferente (suponiendo ANSI con los llamados caracteres de alto ASCII utilizados para representar el latín con diacríticos), pero su búfer debe estar usando algo como UTF-8 (para qué caracteres ASCII con bits altos establecidos no tienen significado, es decir, no son válidos).
wvxvw
1
O tal vez incluso set-clipboard-coding-system. Intente C-h a coding-systemver qué otras funciones de este grupo están disponibles.
wvxvw
El \ 344 que ve es el resultado de un problema de configuración. En lugar de un comando para "arreglarlo" después del hecho, debes investigar por qué lo obtienes en primer lugar. Por ejemplo, empezar con emacs -Qy si ves el problema existe ya, M-x report-emacs-bug.
Stefan
@Stefan A veces, "por qué lo entiendes" es obvio, pero eso no te ayudará a solucionarlo después del hecho. Por ejemplo, acabo de tener este problema como resultado de insert-file-literally(y ya era demasiado tarde para deshacer o eliminar / reinsertar el archivo).
T. Verron
@Stefan podría haber tantas configuraciones incorrectas fuera de Emacs que pueden causar esto, por nombrar algunas: alguien guardó BOM en un archivo que originalmente estaba en una codificación de un solo byte cp-12XX, lo que confundió al editor de origen desde donde se copió el texto, el editor de fuentes informó incorrectamente el tipo de contenido en el portapapeles, etc. Solía ​​ver esto mucho cuando editaba algunas fuentes ASP antiguas que originalmente estaban codificadas incorrectamente.
wvxvw

Respuestas:

4

Resulta que la parte ofensiva de mi archivo .emacs era (set-selection-coding-system 'utf-8). Una vez que eliminé esa línea, Emacs se comportó como se esperaba.

John D. Cook
fuente
2

Una vez hecho esto:

(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 ""))))

de misc-utils.el en https://launchpad.net/sx-emacs-werkstatt

Andreas Röhler
fuente