使emacs不能从XML文件中删除BOM


8

我使用Emacs编辑一个XML文件,该文件也被另一个应用程序读取。另一个应用程序要求文件以字节顺序标记(BOM)开头。但是,Emacs似乎每次我编辑文件时都会删除BOM。有没有办法让Emacs不使用BOM?


这就是为什么当我为schtasks编辑xml文件时,它将编码从unicode更改为unicode big endian,然后不起作用的原因?
js2010

Answers:


9

Emacs是否编写BOM取决于它所使用的编码系统。Emacs在访问文件时会自动选择其使用的编码系统。

您可以将编码系统更改为utf-8-with-signature,这将告诉Emacs编写BOM。

更改访问文件的编码系统:

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

您可以通过设置文件变量来设置Emacs用于特定文件的编码系统。有关如何执行此操作的信息,请参见手册的57.3.4节“ 局部变量”


太棒了,正是我所希望的答案!谢谢!
Vebjorn Ljosa 09年

5

理查德·霍斯金斯(Richard Hoskins)的回答的后续工作:如果您希望emacs隐藏BOM,则可以使用以下代码段禁用* -with-signature编码:

(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混淆;如果确实要这样做,那么必须是实现用于编辑XML文件的Emacs“模式”的代码,以删除BOM。由于您没有说是哪一种,所以我只能为您提供该模式的文档,或者您以fundamental-mode(或类似的非破坏性模式)打开文件。或者尝试M-x find-file-literally其他所有方法是否失败。


使用xml-mode(即sgml-mode),但是这个问题似乎在其他地方:如果我先打开文件,find-file-literally然后再执行do M-x sgml-mode,则不会删除BOM。因为在按字面意义访问文件时,特殊字符不是UTF-8编码的,所以很容易找出在基础格式转换和字符代码转换代码中BOM的删除位置。
Vebjorn Ljosa 09年

0

在我的测试中,编辑UTF-8文件不会更改编码,BOM仍为(efbb bf)。(nxml模式)

嗯,这可能在xml-modenxml-mode或emacs的版本(24 vs 26)之间有所不同。它在底部显示模式。

如果您编辑Emacs一个以unicode(UTF-16little endian)编码的XML文件,它将把编码更改为UTF-16big endian。也许那就是他在说的。

但是BOM仍然存在,从更改fffeffef,并且null在奇数字节而不是偶数字节上。您可以以十六进制模式查看它。

样本xml文件。当emacs将其保存为xml-mode或nxml-mode时,encoding属性指导编码。将修补将来的版本以首先检查BOM。

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

看起来Emacs接受UTF-16UTF-16BE,而Windows接受为UTF-16LE(BE和LE在Emacs中无法使用encoding属性)。编码属性可能是解决这里问题的关键。

将其保存在powershell中会将其转换回utf-16le。

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

如果使用encoding =“ UTF-16LE”和encoding =“ UTF-16BE”,则会删除Bom,从而使文件在emacs中无法识别。这是一个已确认的错误,将对其进行修补:http : //lists.gnu.org/archive/html/bug-gnu-emacs/2019-05/msg00892.html

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.