Я использую Emacs для редактирования XML-файла, который также читается другим приложением. Другое приложение требует, чтобы файл начинался с маркера порядка байтов (BOM). Однако Emacs, похоже, удаляет спецификацию каждый раз, когда я редактирую файл. Есть ли способ заставить Emacs оставить специализацию в покое?
8
Ответы:
Emacs будет писать спецификацию или нет в зависимости от того, какую систему кодирования она использует. Emacs автоматически выбирает систему кодирования, которую он использует при посещении файла.
Вы можете изменить систему кодирования на utf-8-with-signature, которая скажет Emacs написать спецификацию.
Чтобы изменить систему кодирования посещаемого файла:
Вы можете установить систему кодирования, которую Emacs использует для определенного файла, установив переменную файла . Обратитесь к разделу 57.3.4 «Локальные переменные в файлах», чтобы узнать, как это сделать.
источник
Продолжение ответа Ричарда Хоскинса: если вы никогда не хотите, чтобы спецификация была скрыта emacs, вы можете отключить кодировки * -with-signature с помощью этого фрагмента:
Спецификация - это U + FEFF, «неразрывный пробел нулевой ширины», и она не отображается как поле в моем emacs 23.1.1 - вместо этого верхняя строка файла перемещается немного вниз, а иногда поле появляется вокруг первой строки, но вы можете видеть, что спецификация есть, и удалить ее при необходимости.
источник
Emacs «сам» не должен связываться с спецификацией; если это действительно так, то это должен быть код, реализующий «режим» Emacs, который вы используете для редактирования ваших XML-файлов, удаляющих спецификацию. Поскольку вы не говорите, какой это, я могу только отослать вас к документации для этого режима, или что вы открываете файлы в
fundamental-mode
(или аналогичном неразрушающем режиме). Или попробуйте,M-x find-file-literally
если ничего не помогает.источник
find-file-literally
а затем сделаюM-x sgml-mode
, спецификация не будет удалена. Поскольку специальные символы не кодируются в UTF-8 при буквальном посещении файла, было бы неплохо выяснить, где в базовом преобразовании формата и коде преобразования кода символа удаляется спецификация.В моем тесте редактирование
UTF-8
файла не меняет кодировку, и спецификация остается (efbb bf
). (nxml-режим)Ну, это может варьироваться между
xml-mode
иnxml-mode
, или версия Emacs (24 против 26). Это говорит о режиме внизу.Если вы отредактируете Emacs XML-файл, закодированный в юникоде (с
UTF-16
прямым порядком байтов), он изменит кодировку сUTF-16
прямым порядком байтов. Может быть, это то, о чем он говорит.Но спецификация все еще там, изменена с
fffe
наffef
, и нули находятся на нечетном байте вместо четного байта. Вы можете увидеть это в hexl-режиме.Образец XML-файла. Атрибут encoding направляет кодировку, когда emacs сохраняет ее в режиме xml или nxml. Будущая версия будет исправлена для проверки спецификации в первую очередь.
Похоже, что Emacs принимает
UTF-16
какUTF-16BE
, в то время как Windows принимает его какUTF-16LE
(BE и LE не работают в Emacs для атрибута кодирования). Атрибут кодирования, вероятно, является ключом к проблемам здесь.Сохранение его в powershell преобразует его обратно в utf-16le.
При кодировании = "UTF-16LE" и кодировке = "UTF-16BE" бомба удаляется, что делает файл не распознаваемым в emacs. Это подтвержденная ошибка, которая будет исправлена: http://lists.gnu.org/archive/html/bug-gnu-emacs/2019-05/msg00892.html
источник