Comment changer des séquences octales en texte utf-8

9

Lorsque je copie du texte non ascii à partir de Windows et que je le colle dans Emacs, il apparaît comme une séquence octale. Par exemple, si je colle ä dans Emacs, il apparaît comme \ 344.

Je pourrais taper Cq 344 pour récupérer le ä dans Emacs. C'est ennuyeux, mais c'est tolérable s'il n'y a qu'un seul personnage. Mais s'il y a beaucoup de caractères transformés en séquences d'échappement octales, il serait pratique d'exécuter une commande sur une région pour tout convertir à l'intérieur. Existe-t-il déjà une telle commande? Sinon, comment écririez-vous une fonction pour le faire?

[J'ai défini mon système de codage par défaut sur utf-8 dans mon fichier .emacs et j'utilise le même fichier .emacs sous Windows et Linux. Mais le problème ne se produit que lors de la copie d'une application Windows vers Emacs. La copie d'Emacs vers une autre application Windows fonctionne correctement.]

John D. Cook
la source
1
Je pense que ce que vous voulez c'est revert-buffer-with-coding-system(voir sa documentation). Emacs montre les caractères de cette façon parce que vous les avez copiés à partir d'un environnement qui était dans un système de codage différent (en supposant que l'ANSI avec des caractères ASCII élevés utilisés pour rendre le latin avec des signes diacritiques), mais votre tampon doit utiliser quelque chose comme UTF-8 (pour quels caractères ASCII avec des bits élevés définis n'ont aucune signification, c'est-à-dire qu'ils sont invalides)
wvxvw
1
Ou peut-être même set-clipboard-coding-system. Essayez C-h a coding-systemde voir quelles autres fonctions de ce groupe sont disponibles.
wvxvw
Le \ 344 que vous voyez est le résultat d'un problème de configuration. Plutôt qu'une commande pour le "réparer" après coup, vous devriez rechercher pourquoi vous l'obtenez en premier lieu. Par exemple , commencez avec emacs -Qet si vous voyez le problème déjà là, M-x report-emacs-bug.
Stefan
@Stefan Parfois, "pourquoi vous l'obtenez" est évident, mais cela ne vous aidera pas à le réparer après coup. Par exemple, je viens d'avoir ce problème à la suite de insert-file-literally(et il était trop tard pour annuler ou supprimer / réinsérer le fichier).
T. Verron
@Stefan, il pourrait y avoir tellement de mauvaises configurations en dehors d'Emacs qui peuvent provoquer cela, pour n'en nommer que quelques-unes: quelqu'un a enregistré la nomenclature dans un fichier qui était à l'origine dans un codage à un octet cp-12XX, ce qui a confondu l'éditeur source d'où le texte a été copié, l'éditeur de source a incorrectement signalé le type de contenu dans le presse-papiers, etc. J'avais l'habitude de voir cela beaucoup lors de l'édition de certaines sources ASP anciennes qui étaient à l'origine incorrectement encodées.
wvxvw

Réponses:

4

Il s'avère que la partie incriminée de mon fichier .emacs était (set-selection-coding-system 'utf-8). Une fois que j'ai supprimé cette ligne, Emacs s'est comporté comme prévu.

John D. Cook
la source
2

Une fois cela fait:

(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 à https://launchpad.net/sx-emacs-werkstatt

Andreas Röhler
la source