Como alterar seqüências octais em texto utf-8

9

Quando copio texto não-ascii do Windows e colo no Emacs, ele aparece como uma sequência octal. Por exemplo, se eu colar ä no Emacs, ele aparecerá como \ 344.

Eu poderia digitar Cq 344 para obter o ä de volta no Emacs. Isso é chato, mas é tolerável se houver apenas um personagem. Mas se houver muitos caracteres transformados em seqüências de escape octais, seria conveniente executar algum comando em uma região para converter tudo dentro. Já existe esse comando? Caso contrário, como você escreveria uma função para fazer isso?

[Defino meu sistema de codificação padrão como utf-8 no meu arquivo .emacs e uso o mesmo arquivo .emacs no Windows e Linux. Mas o problema só acontece ao copiar de um aplicativo Windows para o Emacs. Copiar do Emacs para outro aplicativo do Windows funciona bem.]

John D. Cook
fonte
11
Eu acho que o que você quer é revert-buffer-with-coding-system(veja a documentação). O Emacs mostra os caracteres desta maneira porque você os copiou de um ambiente que estava em um sistema de codificação diferente (assumindo ANSI com os chamados caracteres ASCII altos usados ​​para renderizar latim com diacríticos), mas seu buffer deve estar usando algo como UTF-8 (por quais caracteres ASCII com conjunto de bits altos não têm significado, isto é, são inválidos).
Wdxvw
11
Ou talvez até set-clipboard-coding-system. Tente C-h a coding-systemver quais outras funções neste grupo estão disponíveis.
Wdxvw
O \ 344 que você vê é o resultado de um problema de configuração. Em vez de um comando para "corrigi-lo" após o fato, você deve investigar por que o obtém em primeiro lugar. Por exemplo, comece com emacs -Qe se você já vir o problema M-x report-emacs-bug,.
18714 Stefan
@ Stefan Às vezes, "por que você o entende" é óbvio, mas isso não ajuda a corrigi-lo após o fato. Por exemplo, acabei de ter esse problema insert-file-literally(e era tarde demais para desfazer ou excluir / reinserir o arquivo).
T. Verron
@Stefan, pode haver tantas configurações erradas fora do Emacs que podem causar isso, para citar algumas: alguém salvou a BOM em um arquivo que originalmente estava em alguma codificação de byte cp-12XX, o que confundiu o editor de origem de onde o texto foi copiado, o editor de código-fonte relatou incorretamente o tipo de conteúdo na área de transferência, etc. Eu costumava ver isso muito ao editar algumas fontes ASP antigas que foram originalmente codificadas incorretamente.
Wdxvw

Respostas:

4

Acontece que a parte ofensiva do meu arquivo .emacs era (set-selection-coding-system 'utf-8). Depois que removi essa linha, o Emacs se comportou como esperado.

John D. Cook
fonte
2

Uma vez feito isso:

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

Andreas Röhler
fonte