我在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;关闭文件并以文本模式重新打开?
答案 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"?>