Buat emacs tidak menghapus BOM dari file XML

8

Saya menggunakan Emacs untuk mengedit file XML yang juga dibaca oleh aplikasi lain. Aplikasi lain mensyaratkan bahwa file mulai dengan byte-order marker (BOM). Namun, Emacs sepertinya menghapus BOM setiap kali saya mengedit file. Apakah ada cara untuk membuat Emacs meninggalkan BOM sendirian?

Vebjorn Ljosa
sumber
Apakah ini sebabnya ketika saya mengedit file xml untuk schtasks, itu mengubah pengkodean dari unicode ke unicode big endian dan kemudian tidak berfungsi?
js2010

Jawaban:

9

Emacs akan menulis BOM atau tidak tergantung pada sistem pengkodean apa yang digunakannya. Emacs secara otomatis memilih sistem pengkodean yang digunakannya ketika mengunjungi suatu file.

Anda dapat mengubah sistem kode ke utf-8-with-signature, yang akan memberi tahu Emacs untuk menulis BOM.

Untuk mengubah sistem pengkodean file yang dikunjungi:

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

Anda dapat mengatur sistem pengkodean yang digunakan Emacs untuk file tertentu dengan mengatur variabel file . Lihat bagian manual yang bagus 57.3.4 Variabel Lokal di File untuk mempelajari cara melakukannya.

Richard Hoskins
sumber
Luar biasa, jawaban yang saya harapkan! Terima kasih!
Vebjorn Ljosa
5

Tindak lanjuti jawaban Richard Hoskins: jika Anda tidak ingin BOM disembunyikan oleh emacs, Anda dapat menonaktifkan kode * -dengan-tanda tangan dengan potongan ini:

(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 adalah U + FEFF, "nol-lebar ruang tanpa melanggar", dan tidak muncul sebagai kotak di emacs saya 23.1.1 — alih-alih, baris teratas file bergerak sedikit ke bawah, dan sebuah kotak kadang-kadang muncul di sekitar baris pertama — tetapi Anda dapat melihat bahwa BOM ada di sana, dan menghapusnya jika perlu.


sumber
1

Emacs "sendiri" tidak boleh main-main dengan BOM; jika benar-benar melakukan itu, maka itu harus menjadi kode yang menerapkan "mode" Emacs yang Anda gunakan untuk mengedit file XML Anda yang menghapus BOM. Karena Anda tidak mengatakan yang mana, saya hanya dapat merujuk Anda ke dokumentasi untuk mode itu, atau bahwa Anda membuka file dalam fundamental-mode(atau mode non-destruktif serupa). Atau coba M-x find-file-literallyjika semuanya gagal.

Teddy
sumber
menggunakan xml-mode (yaitu, sgml-mode), tetapi masalah itu tampaknya ada di tempat lain: jika saya membuka file dengan find-file-literallydan kemudian lakukan M-x sgml-mode, BOM tidak dihapus. Karena karakter khusus tidak dikodekan UTF-8 ketika mengunjungi file secara harfiah, akan lebih baik untuk mencari tahu di mana dalam konversi format yang mendasari dan kode konversi kode karakter BOM dihapus.
Vebjorn Ljosa
0

Dalam pengujian saya, mengedit UTF-8file tidak mengubah penyandian dan BOM tetap ( efbb bf). (nxml-mode)

Ya, ini bisa bervariasi antara xml-modedan nxml-mode, atau versi emacs (24 vs 26). Dikatakan mode di bagian bawah.

Jika Anda mengedit Emacs, file XML yang dikodekan dalam unicode ( UTF-16little endian), itu akan mengubah pengkodean menjadi UTF-16big endian. Mungkin itu yang dia bicarakan.

Tetapi BOM masih ada, diubah dari fffemenjadi ffef, dan nol berada pada byte ganjil bukan byte genap. Anda dapat melihatnya dalam mode hexl.

Contoh file xml. Atribut encoding mengarahkan encoding ketika emacs menyimpannya dalam mode xml atau mode nxml. Versi mendatang akan ditambal untuk memeriksa BOM terlebih dahulu.

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

Sepertinya Emacs mengambil UTF-16sebagai UTF-16BE, sedangkan Windows mengambil sebagai UTF-16LE(BE dan LE tidak melakukan pekerjaan di Emacs untuk atribut encoding). Atribut encoding mungkin kunci untuk masalah di sini.

Menyimpannya di PowerShell akan mengubahnya kembali ke utf-16le.

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

Dengan encoding = "UTF-16LE" dan encoding = "UTF-16BE", bom dihapus, membuat file tidak dapat dikenali dalam emacs. Ini adalah bug yang dikonfirmasi yang akan ditambal: http://lists.gnu.org/archive/html/bug-gnu-emacs/2019-05/msg00892.html

js2010
sumber