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?
8
Réponses:
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é:
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.
la source
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:
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
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 essayezM-x find-file-literally
si tout le reste échoue.la source
find-file-literally
puis le faisM-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.Dans mon test, l'édition d'un
UTF-8
fichier ne change pas l'encodage et la nomenclature reste (efbb bf
). (mode nxml)Eh bien, cela peut varier entre
xml-mode
etnxml-mode
ou 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-16
petit endian), il changera l'encodage enUTF-16
big endian. C'est peut-être de cela qu'il parle.Mais la nomenclature est toujours là, changée de
fffe
enffef
, 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.
Il ressemble à Emacs prend
UTF-16
commeUTF-16BE
, tandis que Windows le prend commeUTF-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.
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
la source