Emacs hexl-mode UTF8 BOM问题

时间:2011-09-08 12:08:40

标签: emacs utf-8

我在Emacs(GNU Emacs 22.2.1 / Debian GNU Linux)下使用 hexl-mode 遇到了一些奇怪的事情。

我有一个UTF8文本文件,我想附加一个BOM(字节顺序掩码:即使不建议将无意义的BOM附加到UTF8文件,该规范明确指出UTF8文件中的BOM < strong> 合法)。

以下是文件命令看到文件的方式:

...$  file  /tmp/test.txt
/tmp/test.txt: UTF-8 Unicode English text

以下作品:

open the UTF8 file (without BOM) in text mode
add three ASCII characters at the beginning of the file
close the file   (<-- see, very important, I need to close the file)
M-x hexl-mode
M-x hexl-find-file  (re-opening the file but this time in hexl-mode)
M-x hexl-insert-hex-string
EFBBBF
C-x C-s (saving the file)
M-x hexl-mode-exit

然后我获得带有BOM的UTF-8文件,如 file 命令所示:

...$  file  /tmp/test.txt
/tmp/test.txt: UTF-8 Unicode (with BOM) English text

(请注意,文件命令以启发式方式检测到具有BOM“英文文本”的UTF-8,但该文件确实包含大量欧元符号:我的观点是,在添加BOM之前,它不是一个ASCII文件,但已经是一个UTF-8文件,如上所示)

但是我根本无法在Emacs 首先下打开文件,然后调用 hexl-mode 然后尝试用0xEB 0xFF 0xBF(BOM)替换前三个字符然后保存。

显然,从(文本)切换到(Hexl)模式时会发生疯狂的转换问题。

我错过了一些显而易见的东西,或者正在转换为Text / Hexl有点破坏,我最好先切换到 hexl-mode ,然后进行十六进制编辑,然后保存&amp;关闭文件并以文本模式重新打开?

2 个答案:

答案 0 :(得分:3)

如果您查看hexl-find-file代码,就会看到它调用find-file-literally,然后切换到hexl-mode

来自find-file-literally

的文档
  

访问文件FILENAME,不进行任何转换。格式转换   和字符代码转换都被禁用,并且是多字节的   在生成的缓冲区中禁用字符。

因此,您可以使用find-file-literally添加3个字符打开文件,然后切换到hexl-mode

答案 1 :(得分:0)

请注意,带有此标记的xml文件在保存时会自动转换为utf-16 big endian。

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

在更改并保存后,这将自动使带有Bom的utf8文件:

<?xml version="1.0" encoding="UTF-8"?>