让 emacs 不从 XML 文件中删除 BOM

让 emacs 不从 XML 文件中删除 BOM

我使用 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 仍然存在,只是从 更改为fffeffef并且空值位于奇数字节而不是偶数字节。您可以在 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

相关内容