Faire en sorte qu'emacs ne supprime pas la nomenclature des fichiers XML

8

J'utilise Emacs pour éditer un fichier XML qui est également lu par une autre application. L'autre application nécessite que le fichier commence par un marqueur d'ordre des octets (BOM). Cependant, Emacs semble supprimer la nomenclature chaque fois que je modifie le fichier. Existe-t-il un moyen de faire en sorte qu'Emacs quitte la nomenclature?

Vebjorn Ljosa
la source
Est-ce la raison pour laquelle lorsque je modifie un fichier xml pour les schtasks, cela change l'encodage d'unicode en unicode big endian et ne fonctionne pas?
js2010 du

Réponses:

9

Emacs écrit ou non une nomenclature en fonction du système de codage utilisé. Emacs choisit automatiquement le système de codage qu'il utilise lors de la visite d'un fichier.

Vous pouvez changer le système de codage en utf-8-with-signature, qui indiquera à Emacs d'écrire la nomenclature.

Pour changer le système de codage d'un fichier visité:

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

Vous pouvez définir le système de codage qu'Emacs utilise pour un fichier particulier en définissant une variable de fichier . Reportez-vous à la section du manuel détaillé 57.3.4 Variables locales dans les fichiers pour savoir comment procéder.

Richard Hoskins
la source
Génial, exactement le genre de réponse que j'espérais! Je vous remercie!
Vebjorn Ljosa
5

Suivi de la réponse de Richard Hoskins: si vous ne voulez jamais que la nomenclature soit masquée par emacs, vous pouvez désactiver les codages * -with-signature avec cet extrait:

(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 nomenclature est U + FEFF, «l'espace insécable de largeur nulle», et n'apparaît pas comme une boîte dans mon emacs 23.1.1 - à la place, la ligne supérieure du fichier est légèrement déplacée vers le bas, et une boîte parfois apparaît autour de la première ligne, mais vous pouvez voir que la nomenclature est là et supprimez-la si nécessaire.


la source
1

Emacs "lui-même" ne devrait pas jouer avec la nomenclature; si c'est vraiment le cas, alors ce devrait être le code implémentant le "mode" Emacs que vous utilisez pour éditer vos fichiers XML qui supprime la nomenclature. Puisque vous ne dites pas lequel c'est, je ne peux que vous référer à la documentation de ce mode, ou que vous ouvrez les fichiers en fundamental-mode(ou mode non destructif similaire). Ou essayez M-x find-file-literallysi tout le reste échoue.

Teddy
la source
utilisez le mode xml (c'est-à-dire le mode sgml), mais ce problème semble être ailleurs: si j'ouvre le fichier avec find-file-literallypuis le fais M-x sgml-mode, la nomenclature n'est pas supprimée. Étant donné que les caractères spéciaux ne sont pas codés en UTF-8 lors de la visite d'un fichier littéralement, il serait intéressant de savoir où, dans la conversion de format sous-jacente et le code de conversion de code de caractères, la nomenclature est supprimée.
Vebjorn Ljosa
0

Dans mon test, l'édition d'un UTF-8fichier ne change pas l'encodage et la nomenclature reste ( efbb bf). (mode nxml)

Eh bien, cela peut varier entre xml-modeet nxml-modeou la version d'emacs (24 vs 26). Il indique le mode en bas.

Si vous modifiez un Emacs un fichier XML encodé en unicode ( UTF-16petit endian), il changera l'encodage en UTF-16big endian. C'est peut-être de cela qu'il parle.

Mais la nomenclature est toujours là, changée de fffeen ffef, et les valeurs nulles sont sur l'octet impair au lieu de l'octet pair. Vous pouvez le voir en mode hexl.

Exemple de fichier xml. L'attribut encoding dirige l'encodage quand emacs l'enregistre en mode xml ou en mode nxml. Une future version sera corrigée pour vérifier d'abord la nomenclature.

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

Il ressemble à Emacs prend UTF-16comme UTF-16BE, tandis que Windows le prend comme UTF-16LE(BE et LE ne fonctionnent pas dans Emacs pour l'attribut de codage). L'attribut de codage est probablement la clé des problèmes ici.

L'enregistrer dans powershell le reconvertira en utf-16le.

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

Avec encoding = "UTF-16LE" et encoding = "UTF-16BE", la nomenclature est supprimée, rendant le fichier méconnaissable dans emacs. Il s'agit d'un bogue confirmé qui sera corrigé: http://lists.gnu.org/archive/html/bug-gnu-emacs/2019-05/msg00892.html

js2010
la source