Làm cho các emacs không xóa BOM khỏi các tệp XML


8

Tôi sử dụng Emacs để chỉnh sửa một tệp XML cũng được đọc bởi một ứng dụng khác. Ứng dụng khác yêu cầu tệp bắt đầu bằng điểm đánh dấu thứ tự byte (BOM). Tuy nhiên, Emacs dường như xóa BOM mỗi khi tôi chỉnh sửa tệp. Có cách nào để khiến Emacs rời khỏi BOM không?


Đây có phải là lý do tại sao khi tôi chỉnh sửa tệp xml cho scht task, nó sẽ thay đổi mã hóa từ unicode thành unicode big endian và sau đó không hoạt động?
js2010

Câu trả lời:


9

Emacs sẽ viết BOM hay không tùy thuộc vào hệ thống mã hóa mà nó đang sử dụng. Emacs tự động chọn hệ thống mã hóa mà nó sử dụng khi truy cập một tệp.

Bạn có thể thay đổi hệ thống mã hóa thành utf-8-with-chữ ký, điều này sẽ cho Emacs viết BOM.

Để thay đổi hệ thống mã hóa của tệp đã truy cập:

C-x RET r utf-8-with-signature RET

Bạn có thể đặt hệ thống mã hóa mà Emacs sử dụng cho một tệp cụ thể bằng cách đặt biến tệp . Xem phần hướng dẫn sử dụng tốt 57.3.4 Biến cục bộ trong Tệp để tìm hiểu cách thực hiện.


Tuyệt vời, chính xác là loại câu trả lời tôi đã hy vọng! Cảm ơn bạn!
Vebjorn Ljosa

5

Theo dõi câu trả lời của Richard Hoskins: nếu bạn không bao giờ muốn BOM bị ẩn bởi các emacs, bạn có thể vô hiệu hóa mã hóa * -với chữ ký với đoạn trích này:

(setq auto-coding-regexp-alist
  (delete (rassoc 'utf-16be-with-signature auto-coding-regexp-alist)
  (delete (rassoc 'utf-16le-with-signature auto-coding-regexp-alist)
  (delete (rassoc 'utf-8-with-signature auto-coding-regexp-alist)
          auto-coding-regexp-alist))))

BOM là U + FEFF, không gian không phá vỡ chiều rộng không giới hạn, và không hiển thị dưới dạng hộp trong emacs 23.1.1 của tôi, thay vào đó, dòng trên cùng của tệp di chuyển xuống một chút và đôi khi một hộp xuất hiện xung quanh dòng đầu tiên nhưng bạn có thể thấy rằng BOM đang ở đó và xóa nó nếu cần thiết.


1

Emacs "chính nó" không nên gây rối với BOM; nếu nó thực sự làm điều đó, thì nó sẽ phải là mã thực hiện "chế độ" Emacs mà bạn đang sử dụng để chỉnh sửa các tệp XML của mình, loại bỏ BOM. Vì bạn không nói đó là cái gì, tôi chỉ có thể giới thiệu cho bạn tài liệu về chế độ đó hoặc bạn mở các tệp trong fundamental-mode(hoặc chế độ không phá hủy tương tự). Hoặc thử M-x find-file-literallynếu tất cả những thứ khác đều thất bại.


sử dụng chế độ xml (nghĩa là sgml-mode), nhưng vấn đề đó dường như ở nơi khác: nếu tôi mở tệp bằng find-file-literallyvà sau đó thực hiện M-x sgml-mode, BOM sẽ không bị xóa. Vì các ký tự đặc biệt không được mã hóa UTF-8 khi truy cập tệp theo nghĩa đen, nên sẽ rất tuyệt nếu tìm ra nơi chuyển đổi định dạng cơ bản và mã chuyển đổi mã ký tự mà BOM bị xóa.
Vebjorn Ljosa

0

Trong thử nghiệm của tôi, chỉnh sửa một UTF-8tệp không thay đổi mã hóa và BOM vẫn ( efbb bf). (chế độ nxml)

Chà, điều này có thể khác nhau giữa xml-modenxml-mode, hoặc phiên bản của emacs (24 so với 26). Nó nói chế độ ở phía dưới.

Nếu bạn chỉnh sửa một Emacs một tệp XML được mã hóa bằng unicode ( UTF-16endian nhỏ), nó sẽ thay đổi mã hóa thành UTF-16endian lớn. Có lẽ đó là những gì anh ấy đang nói.

Nhưng BOM vẫn ở đó, được thay đổi từ fffethành ffefvà null nằm trên byte lẻ thay vì byte chẵn. Bạn có thể thấy nó trong chế độ hexl.

Tệp xml mẫu. Thuộc tính mã hóa chỉ đạo mã hóa khi emacs lưu nó ở chế độ xml hoặc chế độ nxml. Một phiên bản trong tương lai sẽ được vá để kiểm tra BOM trước.

<?xml version="1.0" encoding="UTF-16"?>
<hi />

Có vẻ như Emacs lấy UTF-16như UTF-16BE, trong khi Windows lấy nó làm UTF-16LE(BE và LE không hoạt động trong Emacs cho thuộc tính mã hóa). Thuộc tính mã hóa có lẽ là chìa khóa cho các vấn đề ở đây.

Lưu nó trong powershell sẽ chuyển đổi nó trở lại utf-16le.

[xml]$xml = get-content test.xml; $xml.save('test.xml')

Với mã hóa = "UTF-16LE" và mã hóa = "UTF-16BE", quả bom được loại bỏ, làm cho tệp không thể nhận ra trong emacs. Đây là một lỗi đã được xác nhận sẽ được vá: http://lists.gnu.org/archive/html/orms-gnu-emacs/2019-05/msg00892.html

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.