Stellen Sie sicher, dass Emacs die Stückliste nicht aus XML-Dateien entfernen

8

Ich verwende Emacs, um eine XML-Datei zu bearbeiten, die auch von einer anderen Anwendung gelesen wird. Die andere Anwendung erfordert, dass die Datei mit einem Byte-Order-Marker (BOM) beginnt. Emacs scheint jedoch die Stückliste jedes Mal zu entfernen, wenn ich die Datei bearbeite. Gibt es eine Möglichkeit, Emacs dazu zu bringen, die Stückliste in Ruhe zu lassen?

Vebjorn Ljosa
quelle
Ist dies der Grund, warum beim Bearbeiten einer XML-Datei für Schtasks die Codierung von Unicode in Unicode Big Endian geändert wird und dann nicht funktioniert?
js2010

Antworten:

9

Emacs schreibt eine Stückliste oder nicht, je nachdem, welches Codierungssystem verwendet wird. Emacs wählt automatisch das Codierungssystem aus, das beim Besuch einer Datei verwendet wird.

Sie können das Codierungssystem in utf-8-with-Signatur ändern, wodurch Emacs angewiesen wird, die Stückliste zu schreiben.

So ändern Sie das Codierungssystem einer besuchten Datei:

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

Sie können das Codierungssystem festlegen, das Emacs für eine bestimmte Datei verwendet, indem Sie eine Dateivariable festlegen . Weitere Informationen hierzu finden Sie im Abschnitt 57.3.4 Lokale Variablen in Dateien .

Richard Hoskins
quelle
Genial, genau die Antwort, auf die ich gehofft hatte! Vielen Dank!
Vebjorn Ljosa
5

Follow-up zu Richard Hoskins 'Antwort: Wenn Sie nie möchten, dass die Stückliste von Emacs ausgeblendet wird, können Sie die * -mit-Signatur-Codierungen mit diesem Snippet deaktivieren:

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

Die Stückliste ist U + FEFF, der "nicht unterbrechende Bereich mit der Breite Null", und wird in meinen Emacs 23.1.1 nicht als Feld angezeigt. Stattdessen wird die oberste Zeile der Datei leicht nach unten verschoben, manchmal auch als Feld wird in der ersten Zeile angezeigt. Sie können jedoch sehen, dass die Stückliste vorhanden ist, und sie gegebenenfalls löschen.


quelle
1

Emacs "selbst" sollte sich nicht mit der Stückliste anlegen. Wenn dies wirklich der Fall ist, muss es sich um den Code handeln, der den Emacs-Modus implementiert, mit dem Sie Ihre XML-Dateien bearbeiten und die Stückliste entfernen. Da Sie nicht sagen, welches das ist, kann ich Sie nur auf die Dokumentation für diesen Modus verweisen oder darauf, dass Sie die Dateien in fundamental-mode(oder einem ähnlichen zerstörungsfreien Modus) öffnen . Oder versuchen Sie es, M-x find-file-literallywenn alles andere fehlschlägt.

Teddy
quelle
Verwenden Sie den XML-Modus (dh den SGML-Modus), aber dieses Problem scheint an anderer Stelle zu liegen: Wenn ich die Datei mit öffne find-file-literallyund dies dann tue M-x sgml-mode, wird die Stückliste nicht entfernt. Da Sonderzeichen beim wörtlichen Besuch einer Datei nicht UTF-8-codiert sind, wäre es hilfreich herauszufinden, wo in der zugrunde liegenden Formatkonvertierung und im Zeichencode-Konvertierungscode die Stückliste entfernt wird.
Vebjorn Ljosa
0

In meinem Test UTF-8ändert das Bearbeiten einer Datei nichts an der Codierung und die Stückliste bleibt ( efbb bf). (nxml-Modus)

Nun, dies kann zwischen xml-modeund nxml-modeoder der Version von Emacs variieren (24 vs 26). Es heißt der Modus unten.

Wenn Sie eine Emacs-XML-Datei bearbeiten, die in Unicode ( UTF-16Little Endian) codiert ist , wird die Codierung in UTF-16Big Endian geändert . Vielleicht ist es das, worüber er spricht.

Aber die Stückliste ist immer noch da, geändert von fffezu ffef, und die Nullen befinden sich auf dem ungeraden Byte anstelle des geraden Bytes. Sie können es im Hexl-Modus sehen.

Beispiel-XML-Datei. Das Codierungsattribut steuert die Codierung, wenn Emacs sie im XML-Modus oder im XML-Modus speichert. Eine zukünftige Version wird gepatcht, um zuerst die Stückliste zu überprüfen.

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

Es sieht so aus, als würde Emacs UTF-16als nehmen UTF-16BE, während Windows es als nimmt UTF-16LE(BE und LE funktionieren in Emacs nicht für das Codierungsattribut). Das Codierungsattribut ist wahrscheinlich der Schlüssel zu den Problemen hier.

Wenn Sie es in Powershell speichern, wird es wieder in utf-16le konvertiert.

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

Mit encoding = "UTF-16LE" und encoding = "UTF-16BE" wird die Bom entfernt, wodurch die Datei in Emacs nicht wiederzuerkennen ist. Dies ist ein bestätigter Fehler, der behoben wird: http://lists.gnu.org/archive/html/bug-gnu-emacs/2019-05/msg00892.html

js2010
quelle