Cách thay đổi chuỗi bát phân thành văn bản utf-8


9

Khi tôi sao chép văn bản không phải mã ascii từ Windows và dán vào Emacs, nó sẽ hiển thị dưới dạng một chuỗi bát phân. Ví dụ: nếu tôi dán ä vào Emacs, nó hiển thị là \ 344.

Tôi có thể gõ Cq 344 để lấy lại ä trong Emacs. Điều đó thật khó chịu, nhưng có thể chấp nhận được nếu chỉ có một nhân vật. Nhưng nếu có nhiều ký tự biến thành chuỗi thoát bát phân, sẽ thuận tiện khi chạy một số lệnh trên một vùng để chuyển đổi mọi thứ bên trong. Đã có một lệnh như vậy? Nếu không, làm thế nào bạn sẽ viết một chức năng để làm điều đó?

[Tôi đặt hệ thống mã hóa mặc định của mình thành utf-8 trong tệp .emacs của mình và tôi sử dụng cùng một tệp .emacs trên Windows và Linux. Nhưng vấn đề chỉ xảy ra khi sao chép từ một ứng dụng Windows vào Emacs. Sao chép từ Emacs sang một ứng dụng Windows khác hoạt động tốt.]


1
Tôi nghĩ rằng những gì bạn muốn là revert-buffer-with-coding-system(xem tài liệu này). Emacs hiển thị các ký tự theo cách này vì bạn đã sao chép chúng từ một môi trường trong hệ thống mã hóa khác nhau (giả sử ANSI với cái gọi là các ký tự ASCII cao được sử dụng để hiển thị tiếng Latin bằng dấu phụ), nhưng bộ đệm của bạn phải sử dụng cái gì đó như UTF-8 (cho mà các ký tự ASCII có bit cao được đặt không có nghĩa, không hợp lệ).
wvxvw

1
Hoặc, thậm chí có thể set-clipboard-coding-system. Hãy thử C-h a coding-systemxem những chức năng khác trong nhóm này có sẵn.
wvxvw

\ 344 bạn thấy là kết quả của sự cố cấu hình. Thay vì một lệnh để "sửa" nó sau khi thực tế, bạn nên điều tra lý do tại sao bạn nhận được nó ngay từ đầu. Ví dụ, bắt đầu với emacs -Qvà nếu bạn thấy vấn đề ở đó , M-x report-emacs-bug.
Stefan

@Stefan Đôi khi, "tại sao bạn hiểu" là điều hiển nhiên, nhưng điều đó sẽ không giúp bạn sửa nó sau khi thực tế. Ví dụ, tôi chỉ gặp sự cố này do insert-file-literally(và đã quá muộn để hoàn tác hoặc xóa / cài đặt lại tệp).
T. Verron

@Stefan có thể có rất nhiều cấu hình sai bên ngoài Emacs có thể gây ra điều này, đặt tên cho một số: ai đó đã lưu BOM vào một tệp ban đầu trong một số mã hóa byte đơn cp-12XX, khiến trình soạn thảo nguồn bị sao chép từ đó trình chỉnh sửa nguồn đã báo cáo không chính xác loại nội dung trong bảng tạm, v.v. Tôi đã từng thấy điều này rất nhiều khi chỉnh sửa một số nguồn ASP cổ được mã hóa không chính xác.
wvxvw

Câu trả lời:


4

Hóa ra phần vi phạm trong tệp .emacs của tôi là (set-selection-coding-system 'utf-8). Khi tôi xóa dòng đó, Emacs cư xử như mong đợi.


2

Sau khi thực hiện điều này:

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

từ misc-utils.el tại https://launchpad.net/sx-emacs-werkstatt

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.