Bagaimana mengubah urutan oktal menjadi teks utf-8

9

Ketika saya menyalin teks non-ascii dari Windows dan menempelkannya ke Emacs, itu muncul sebagai urutan oktal. Sebagai contoh, jika saya menempelkan ä ke Emacs itu muncul sebagai \ 344.

Saya bisa mengetikkan Cq 344 untuk mendapatkan ä kembali di Emacs. Itu menjengkelkan, tetapi bisa ditoleransi jika hanya ada satu karakter. Tetapi jika ada banyak karakter yang berubah menjadi urutan escape oktal, akan lebih mudah untuk menjalankan beberapa perintah pada suatu wilayah untuk mengkonversi semua yang ada di dalamnya. Apakah sudah ada perintah seperti itu? Jika tidak, bagaimana Anda menulis fungsi untuk melakukannya?

[Saya mengatur sistem pengkodean default saya ke utf-8 dalam file .emacs saya, dan saya menggunakan file .emacs yang sama pada Windows dan Linux. Tetapi masalahnya hanya terjadi ketika menyalin dari aplikasi Windows ke Emacs. Menyalin dari Emacs ke aplikasi Windows lain berfungsi dengan baik.]

John D. Cook
sumber
1
Saya pikir yang Anda inginkan adalah revert-buffer-with-coding-system(lihat dokumentasinya). Emacs menunjukkan karakter dengan cara ini karena Anda menyalinnya dari lingkungan yang berada dalam sistem pengkodean yang berbeda (dengan asumsi ANSI dengan apa yang disebut karakter ASCII tinggi yang digunakan untuk membuat bahasa Latin dengan diakritik), tetapi buffer Anda harus menggunakan sesuatu seperti UTF-8 (untuk karakter ASCII dengan set bit tinggi tidak memiliki arti, yaitu tidak valid).
wvxvw
1
Atau, bahkan mungkin set-clipboard-coding-system. Coba C-h a coding-systemlihat fungsi apa saja yang ada di grup ini.
wvxvw
\ 344 yang Anda lihat adalah hasil dari masalah konfigurasi. Daripada perintah untuk "memperbaikinya" setelah fakta, Anda harus menyelidiki mengapa Anda mendapatkannya di tempat pertama. Misalnya mulai dengan emacs -Qdan jika Anda sudah melihat masalah di sana M-x report-emacs-bug,.
Stefan
@Stefan Terkadang, "mengapa Anda mendapatkannya" jelas, tetapi itu tidak akan membantu Anda memperbaikinya setelah faktanya. Sebagai contoh, saya baru saja mengalami masalah ini insert-file-literally(dan sudah terlambat untuk membatalkan atau menghapus / masukkan kembali file).
T. Verron
@Stefan mungkin ada banyak kesalahan konfigurasi di luar Emacs yang dapat menyebabkan hal ini, untuk menyebutkan beberapa: seseorang menyimpan BOM ke dalam sebuah file yang aslinya dalam beberapa pengkodean byte tunggal cp-12XX, yang membingungkan editor sumber dari mana teks disalin dari, editor sumber salah melaporkan jenis konten di clipboard dll. Saya sering melihat ini ketika mengedit beberapa sumber ASP kuno yang awalnya salah dikodekan.
wvxvw

Jawaban:

4

Ternyata bagian yang menyinggung dari file .emacs saya adalah (set-selection-coding-system 'utf-8). Setelah saya menghapus garis itu, Emacs berperilaku seperti yang diharapkan.

John D. Cook
sumber
2

Setelah dibuat ini:

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

dari misc-utils.el di https://launchpad.net/sx-emacs-werkstatt

Andreas Röhler
sumber