Зробіть emacs не видаляти BOM з XML-файлів


8

Я використовую Emacs для редагування XML-файлу, який також читається іншою програмою. Інша програма вимагає, щоб файл починався з маркера порядку байт (BOM). Однак Emacs, здається, видаляє BOM кожен раз, коли я редагую файл. Чи є спосіб змусити Emacs залишити BOM у спокої?


Це чому, коли я редагую XML-файл для schtasks, він змінює кодування з unicode на unicode big endian, а потім не працює?
js2010

Відповіді:


9

Emacs запише BOM чи не залежно від того, яку систему кодування вона використовує. Emacs автоматично вибирає систему кодування, яку вона використовує під час відвідування файлу.

Ви можете змінити систему кодування на utf-8-з-підписом, що дозволить Emacs написати BOM.

Щоб змінити систему кодування відвіданого файлу:

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

Ви можете встановити систему кодування, яку Emacs використовує для певного файлу, встановивши змінну файлу . Див. Розділ 57.3.4 Локальні змінні у файлах, щоб дізнатися, як це зробити.


Дивовижна, саме таку відповідь, на яку я сподівався! Дякую!
Вебйорн Льоса

5

Продовження відповіді Річарда Хоскінса: якщо ви ніколи не хочете, щоб BOM приховувався emacs, ви можете відключити * -з кодуванням підпису за допомогою цього фрагмента:

(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 - це U + FEFF, "пробіл нульової ширини", і не відображається як поле в моїх програмах emacs 23.1.1 - натомість верхній рядок файлу переміщується трохи вниз, а поле іноді з'являється навколо першого рядка, але ви можете побачити, що BOM є, і видалити його, якщо потрібно.


1

Emacs "сам" не повинен возитися з BOM; якщо це дійсно так, то це повинен бути код, що реалізує "режим" Emacs, який ви використовуєте для редагування своїх XML-файлів, що видаляє BOM. Оскільки ви не кажете, який саме є, я можу посилатись на вас лише в документації для цього режиму або ви відкриваєте файли в fundamental-mode(або подібному неруйнівному режимі). Або спробуйте, M-x find-file-literallyякщо все інше не вдасться.


використовувати xml-режим (тобто, sgml-режим), але ця проблема, здається, в іншому місці: якщо я відкрию файл, find-file-literallyа потім зробіть M-x sgml-mode, BOM не видаляється. Оскільки спеціальні символи не кодуються UTF-8 при буквальному відвідуванні файлу, було б непогано розібратися, де з базового коду перетворення формату та коду перетворення символів BOM видаляється.
Вебйорн Льоса

0

У моєму тесті редагування UTF-8файлу не змінює кодування, і BOM залишається ( efbb bf). (nxml-режим)

Ну, це може відрізнятися між xml-modeта nxml-modeабо версією emacs (24 проти 26). Він говорить про режим знизу.

Якщо ви відредагуєте Emacs XML-файл, закодований у unicode ( UTF-16маленький ендіан), він змінить кодування на UTF-16великий endian. Можливо, саме про це він і говорить.

Але BOM все ще є, змінився з fffeна ffef, і нулі знаходяться на непарному байті, а не парному байті. Ви можете бачити це в hexl-режимі.

Зразок XML-файлу. Атрибут кодування спрямовує кодування, коли emacs зберігає його в xml-режимі або nxml-режимі. Майбутня версія буде виправлена, щоб спочатку перевірити BOM.

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

Схоже, Emacs приймає UTF-16як UTF-16BE, а Windows приймає це як UTF-16LE(BE і LE не працюють в Emacs для атрибута кодування). Атрибут кодування, ймовірно, є ключовим для тут проблем.

Збереження його в shellhell перетворить його на utf-16le.

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

З encoding = "UTF-16LE" та encoding = "UTF-16BE", бома видаляється, що робить файл невпізнанним у emacs. Це підтверджена помилка, яку буде виправлено: http://lists.gnu.org/archive/html/bug-gnu-emacs/2019-05/msg00892.html

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.