我使用Emacs编辑一个XML文件,该文件也被另一个应用程序读取。另一个应用程序要求文件以字节顺序标记(BOM)开头。但是,Emacs似乎每次我编辑文件时都会删除BOM。有没有办法让Emacs不使用BOM?
我使用Emacs编辑一个XML文件,该文件也被另一个应用程序读取。另一个应用程序要求文件以字节顺序标记(BOM)开头。但是,Emacs似乎每次我编辑文件时都会删除BOM。有没有办法让Emacs不使用BOM?
Answers:
Emacs是否编写BOM取决于它所使用的编码系统。Emacs在访问文件时会自动选择其使用的编码系统。
您可以将编码系统更改为utf-8-with-signature,这将告诉Emacs编写BOM。
更改访问文件的编码系统:
C-x RET r utf-8-with-signature RET
您可以通过设置文件变量来设置Emacs用于特定文件的编码系统。有关如何执行此操作的信息,请参见手册的57.3.4节“ 局部变量”。
理查德·霍斯金斯(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表在其中,并在必要时将其删除。
Emacs的“自身”不应与BOM混淆;如果确实要这样做,那么必须是实现用于编辑XML文件的Emacs“模式”的代码,以删除BOM。由于您没有说是哪一种,所以我只能为您提供该模式的文档,或者您以fundamental-mode
(或类似的非破坏性模式)打开文件。或者尝试M-x find-file-literally
其他所有方法是否失败。
find-file-literally
然后再执行do M-x sgml-mode
,则不会删除BOM。因为在按字面意义访问文件时,特殊字符不是UTF-8编码的,所以很容易找出在基础格式转换和字符代码转换代码中BOM的删除位置。
在我的测试中,编辑UTF-8
文件不会更改编码,BOM仍为(efbb bf
)。(nxml模式)
嗯,这可能在xml-mode
和nxml-mode
或emacs的版本(24 vs 26)之间有所不同。它在底部显示模式。
如果您编辑Emacs一个以unicode(UTF-16
little endian)编码的XML文件,它将把编码更改为UTF-16
big endian。也许那就是他在说的。
但是BOM仍然存在,从更改fffe
为ffef
,并且null在奇数字节而不是偶数字节上。您可以以十六进制模式查看它。
样本xml文件。当emacs将其保存为xml-mode或nxml-mode时,encoding属性指导编码。将修补将来的版本以首先检查BOM。
<?xml version="1.0" encoding="UTF-16"?>
<hi />
看起来Emacs接受UTF-16
为UTF-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