emacs中各种类型的'utf-8'之间的区别是什么?

fly*_*yer 9 unicode emacs encoding

在Emacs中,打字后

M-x revert-buffer-with-coding-system
Run Code Online (Sandbox Code Playgroud)

我可以看到很多类型的'utf-8',例如,utf-8,utf-8-auto-unix,utf-8-emacs-unix等.

我想知道他们之间有什么区别.

我用谷歌搜索了他们但找不到合适的答案.

PS

我问这个问题是因为几个月前我遇到了编码问题.我在Emacs和我的〜/ .emacs中编写了一个php程序,我设置了

(prefer-coding-system 'utf-8)
Run Code Online (Sandbox Code Playgroud)

但是当在浏览器中浏览php页面时,我发现由于编码问题导致浏览器无法正确显示内容,即使我已经写过

<meta name="Content-Type" content="text/html; charset=UTF-8" />
Run Code Online (Sandbox Code Playgroud)

在页面中.

但是在我使用notepad ++将文件存储在utf-8中后,浏览器可以正确显示内容.

所以我想了解更多有关Emacs编码的信息.

Sek*_*eki 13

编码名称的最后一部分(例如macin utf-8-mac)通常用于描述将在行使用的特殊字符:

  • -mac:CR,MacOS的标准行分隔符(直到OS X)
  • -unix:LFunice系统的标准分隔符(所以基于BSD的Mac OS X)
  • -dos:CR+LFDOS/Windows的分隔符

一些额外的编码参数包括:

  • -emacs:支持编码所有Emacs字符(包括非Unicode)
  • -with-signature:强制使用BOM(见下文)
  • -auto:自动检测BOM

您可以组合使用不同的可能性,使列表显示在Emacs中.

要获得有关编码提供的行结尾类型,BOM和字符集的信息,您可以使用describe-coding-system或:C-hC

关于BOM:

  • utf标准定义了一个特殊的签名,放在(文本)文件的开头,以区分utf-16编码的字节顺序(因为utf-16存储的字符有2个字节 - 或16位)或字节序:某些系统首先放置最重要的字节(big-endian - > utf-16be),其他一些放置最低有效字节(little-endian - > utf-16le).该签名称为BOM:字节顺序标记

  • in utf-8,每个字符由一个字节表示(对于大于127的扩展字符除外,它们使用特殊的字节序列)因此指定字节顺序是无意义的但是这个签名无论如何都有用于检测utf-8文件而不是一个纯文本ascii.utf-8文件与ascii文件的区别仅在于扩展字符,如果没有解析整个文件直到找到伪文件使其立即可见时才能检测到.(BTW Emacs非常有效地进行这种自动检测)

  • 仅供参考,BOM是以下字节作为文件的第一个字节:

    • utf-16le: FF FE
    • utf-16be: FE FF
    • utf-8: EF BB BF
  • 您可以要求Emacs打开一个没有任何转换的文件find-file-literally:如果第一行开头,您会看到未解码的utf-8 BOM

正如@wvxvw所说,您的问题是文件开头可能缺少BOM,导致错误地解释和呈现.BTW,M-x hexl-mode也是检查文件原始内容的一个非常方便的工具.感谢您指向我(我经常使用外部十六进制编辑器,而它可以直接在Emacs中完成)