Fai in modo che emacs non rimuova la DBA dai file XML


8

Uso Emacs per modificare un file XML che viene letto anche da un'altra applicazione. L'altra applicazione richiede che il file inizi con un marker di ordine byte (BOM). Tuttavia, Emacs sembra rimuovere la DBA ogni volta che modifico il file. C'è un modo per fare in modo che Emacs lasci in pace la DBA?


È per questo che quando modifico un file xml per schtasks, cambia la codifica da unicode a unicode big endian e quindi non funziona?
js2010,

Risposte:


9

Emacs scriverà una distinta base o meno a seconda del sistema di codifica utilizzato. Emacs sceglie automaticamente il sistema di codifica che utilizza durante la visita di un file.

Puoi modificare il sistema di codifica in utf-8-with-signature, che indicherà a Emacs di scrivere la DBA.

Per modificare il sistema di codifica di un file visitato:

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

È possibile impostare il sistema di codifica utilizzato da Emacs per un determinato file impostando una variabile di file . Vedere la sezione del manuale fine 57.3.4 Variabili locali nei file per sapere come farlo.


Fantastico, esattamente il tipo di risposta che speravo! Grazie!
Vebjorn Ljosa,

5

Seguito dato alla risposta di Richard Hoskins: se non vuoi mai che la distinta componenti venga nascosta da emacs, puoi disabilitare i codici * -con-signature con questo frammento:

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

La DBA è U + FEFF, lo "spazio non-breaking di larghezza zero", e non si presenta come una casella nel mio emacs 23.1.1, invece la riga superiore del file viene spostata leggermente verso il basso e una casella a volte appare intorno alla prima riga, ma puoi vedere che la distinta componenti è presente ed eliminarla se necessario.


1

Emacs "stesso" non dovrebbe fare confusione con la DBA; se lo fa davvero, allora dovrebbe essere il codice che implementa la "modalità" Emacs che stai usando per modificare i tuoi file XML che rimuove la distinta base. Dal momento che non dici quale sia, posso solo rimandarti alla documentazione per quella modalità, o che apri i file in fundamental-mode(o simile modalità non distruttiva). Oppure prova M-x find-file-literallyse tutto il resto fallisce.


uso la modalità xml (cioè la modalità sgml), ma quel problema sembra essere altrove: se apro il file con find-file-literallye poi lo faccio M-x sgml-mode, la distinta base non viene rimossa. Poiché i caratteri speciali non sono codificati UTF-8 quando si visita un file letteralmente, sarebbe bello capire dove nella BOM viene rimossa la conversione del formato sottostante e il codice di conversione del codice carattere.
Vebjorn Ljosa,

0

Nel mio test, la modifica di un UTF-8file non cambia la codifica e la distinta base rimane ( efbb bf). (nxml-mode)

Bene, questo può variare tra xml-modee nxml-mode, o la versione di emacs (24 vs 26). Dice la modalità in basso.

Se modificate un Emacs un file XML codificato in unicode ( UTF-16little endian), cambierà la codifica in UTF-16big endian. Forse è di questo che parla.

Ma la BOM è ancora lì, modificata da fffea ffef, e i valori null si trovano sul byte dispari anziché sul byte pari. Puoi vederlo in modalità hexl.

File XML di esempio. L'attributo encoding dirige la codifica quando emacs la salva in modalità xml o nxml. Una versione futura verrà modificata per verificare prima la DBA.

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

Sembra che Emacs prenda UTF-16come UTF-16BE, mentre Windows lo considera come UTF-16LE(BE e LE non funzionano in Emacs per l'attributo di codifica). L'attributo di codifica è probabilmente la chiave per i problemi qui.

Salvandolo in PowerShell lo convertirà nuovamente in utf-16le.

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

Con encoding = "UTF-16LE" e encoding = "UTF-16BE", il bom viene rimosso, rendendo il file irriconoscibile in emacs. Questo è un bug confermato che verrà corretto: http://lists.gnu.org/archive/html/bug-gnu-emacs/2019-05/msg00892.html

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.