在Emacs中,输入
后M-x revert-buffer-with-coding-system
我可以看到很多类型的'utf-8',例如 utf-8 , utf-8-auto-unix , utf-8 -emacs-unix 等等。
我想知道它们之间有什么区别。
我用谷歌搜索了他们但找不到合适的答案。
P.S。
我问这个问题是因为几个月前我遇到了编码问题。我在Emacs和我的〜/ .emacs 中编写了一个php程序,我设置了
(prefer-coding-system 'utf-8)
但是在浏览器中浏览php页面时,我发现由于编码问题导致浏览器无法正确显示内容,即使我已写过
<meta name="Content-Type" content="text/html; charset=UTF-8" />
在页面中。
但是在使用 notepad ++ 将文件存储在utf-8中后,浏览器可以正确显示内容。
所以我想了解更多有关Emacs编码的信息。
答案 0 :(得分:13)
编码名称的最后一部分(例如mac
中的utf-8-mac
)通常用于描述将在行末尾使用的特殊字符:< / p>
-mac
:CR
,MacOS的标准行分隔符(直到OS X)-unix
:LF
unice系统的标准分隔符(所以基于BSD的Mac OS X)-dos
:CR+LF
DOS / Windows的分隔符一些额外的编码参数包括:
-emacs
:支持对所有Emacs字符(包括非Unicode)进行编码-with-signature
:强制使用BOM(见下文)-auto
:自动检测BOM 您可以结合使用不同的可能性,使列表显示在Emacs中。
要获得有关编码提供的行结尾类型,BOM和字符集的信息,您可以使用describe-coding-system
或: Ch C
关于BOM:
utf标准定义了一个特殊的签名,放在(文本)文件的开头,以区分utf-16
编码的字节顺序(因为utf-16存储的字符为2)字节 - 或16位)或字节序:一些系统将最高有效字节放在第一位(big-endian - &gt; utf-16be
),其他一些系统将最低有效字节放在第一位(little-endian - &gt; utf-16le
)。该签名称为 BOM :字节顺序标记
utf-8
中的,每个字符由一个字节表示(对于大于127的扩展字符,它们使用特殊的字节序列除外),因此指定字节顺序是一个废话,但这个签名无论如何都有用于检测utf-8文件而不是纯文本ascii。 utf-8文件与ascii文件的区别仅在于扩展字符,如果没有解析整个文件直到找到伪文件使其立即可见时才能检测到。 (BTW Emacs非常有效地进行这种自动检测)
仅供参考,BOM是以下字节作为文件的第一个字节:
FF FE
FE FF
EF BB BF
您可以要求Emacs打开一个文件而不使用find-file-literally
进行任何转换:如果第一行以
开头,您会看到未解码的utf-8 BOM
正如@wvxvw所说,您的问题是文件开头可能缺少BOM,导致错误地解释和呈现。
BTW,M-x hexl-mode
也是检查文件原始内容的非常方便的工具。感谢您指向我(我经常使用外部十六进制编辑器,而它可以直接在Emacs中完成)
答案 1 :(得分:2)
除了在设置
之后,不能多说这个问题(prefer-coding-system 'utf-8)
(setq coding-system-for-read 'utf-8)
(setq coding-system-for-write 'utf-8)
我2年多没有任何unicode问题了。