我使用 Emacs 编辑 XML 文件,该文件也被另一个应用程序读取。另一个应用程序要求文件以字节顺序标记 (BOM) 开头。但是,每次我编辑文件时,Emacs 似乎都会删除 BOM。有没有办法让 Emacs 保留 BOM?
答案1
Emacs 是否写入 BOM 取决于它使用的编码系统。Emacs 在访问文件时会自动选择使用的编码系统。
您可以将编码系统更改为 utf-8-with-signature,这将告诉 Emacs 写入 BOM。
要更改访问文件的编码系统:
C-x RET r utf-8-with-signature RET
你可以通过设置文件变量. 请参阅精简手册部分57.3.4 文件中的局部变量学习如何做到这一点。
答案2
跟进 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 在那里,并在必要时将其删除。
答案3
Emacs“本身”不应该弄乱 BOM;如果它确实这样做了,那么它必须是实现您用来编辑 XML 文件的 Emacs“模式”的代码,该模式会删除 BOM。由于您没有说是哪一种,我只能让您参考该模式的文档,或者您打开文件时使用的模式fundamental-mode
(或类似的非破坏性模式)。或者M-x find-file-literally
如果其他方法都失败了,请尝试一下。
答案4
在我的测试中,编辑UTF-8
文件不会改变编码,并且 BOM 仍然存在(efbb bf
)。(nxml-mode)
嗯,这可能在xml-mode
和之间有所不同nxml-mode
,或者 emacs 的版本(24 vs 26)。它在底部显示了模式。
如果您在 Emacs 中编辑以 unicode(小端)编码的 XML 文件UTF-16
,它会将编码更改为UTF-16
大端。也许这就是他所说的。
但是 BOM 仍然存在,只是从 更改为fffe
,ffef
并且空值位于奇数字节而不是偶数字节。您可以在 hexl 模式下看到它。
示例 xml 文件。当 emacs 以 xml 模式或 nxml 模式保存时,encoding 属性指示编码。将来的版本将修补以首先检查 BOM。
<?xml version="1.0" encoding="UTF-16"?>
<hi />
看起来 Emacs 接受UTF-16
的是UTF-16BE
,而 Windows 接受的是UTF-16LE
(在 Emacs 中,BE 和 LE 的编码属性不起作用)。编码属性可能是这里问题的关键。
将其保存在 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