Jak zmienić sekwencje ósemkowe na tekst utf-8

9

Kiedy kopiuję tekst nie-ascii z Windows i wklejam do Emacsa, pojawia się on jako sekwencja ósemkowa. Na przykład, jeśli wkleję ä do Emacsa, pojawi się on jako \ 344.

Mógłbym wpisać Cq 344, aby odzyskać ä z powrotem w Emacsie. To denerwujące, ale jest do zaakceptowania, jeśli jest tylko jedna postać. Ale jeśli jest wiele znaków zamienionych w ósemkowe sekwencje specjalne, wygodnie byłoby uruchomić polecenie w regionie, aby przekonwertować wszystko w środku. Czy jest już takie polecenie? Jeśli nie, jak napisałbyś funkcję, aby to zrobić?

[Ustawiam mój domyślny system kodowania na utf-8 w moim pliku .emacs i używam tego samego pliku .emacs w systemie Windows i Linux. Ale problem występuje tylko podczas kopiowania z aplikacji Windows do Emacsa. Kopiowanie z Emacsa do innej aplikacji Windows działa dobrze.]

John D. Cook
źródło
1
Myślę, że chcesz tego revert-buffer-with-coding-system(zobacz dokumentację). Emacs pokazuje znaki w ten sposób, ponieważ skopiowałeś je ze środowiska, które było w innym systemie kodowania (zakładając, że ANSI z tak zwanymi wysokimi znakami ASCII używanymi do renderowania alfabetu łacińskiego za pomocą znaków diakrytycznych), ale twój bufor musi używać czegoś takiego jak UTF-8 (dla które znaki ASCII z zestawem wysokich bitów nie mają znaczenia, tzn. są nieprawidłowe).
wvxvw
1
A może nawet set-clipboard-coding-system. Spróbuj C-h a coding-systemsprawdzić, jakie inne funkcje w tej grupie są dostępne.
wvxvw
\ 344, który widzisz, jest wynikiem problemu z konfiguracją. Zamiast polecenia „naprawienia” tego po fakcie, powinieneś dowiedzieć się, dlaczego go otrzymałeś. Np zacząć emacs -Q, a jeśli widzi ten problem istnieje już M-x report-emacs-bug.
Stefan
@Stefan Czasami „dlaczego to dostajesz” jest oczywiste, ale to nie pomoże ci to naprawić po fakcie. Na przykład właśnie wystąpił ten problem insert-file-literally(i było już za późno, aby cofnąć lub usunąć / ponownie wstawić plik).
T. Verron,
@Stefan może istnieć tak wiele błędnych konfiguracji poza Emacsem, że może to spowodować, żeby wymienić kilka: ktoś zapisał BOM w pliku, który pierwotnie był w jakimś kodowaniu jednobajtowym cp-12XX, co dezorientowało edytor źródłowy, z którego skopiowano tekst, edytor źródeł niepoprawnie zgłosił rodzaj zawartości w schowku itp. Często to widziałem podczas edycji niektórych starożytnych źródeł ASP, które były pierwotnie niepoprawnie zakodowane.
wvxvw

Odpowiedzi:

4

Okazuje się, że obrażająca część mojego pliku .emacs była (set-selection-coding-system 'utf-8). Po usunięciu tej linii Emacs zachowywał się zgodnie z oczekiwaniami.

John D. Cook
źródło
2

Raz to zrobił:

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

z misc-utils.el na https://launchpad.net/sx-emacs-werkstatt

Andreas Röhler
źródło