10

在 Emacs 中,键入后

M-x revert-buffer-with-coding-system

我可以看到许多类型的“utf-8”,例如,utf-8utf-8-auto-unixutf-8-emacs-unix等。

我想知道它们之间有什么区别。

我已经用谷歌搜索了它们,但找不到正确的答案。

附言

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

(prefer-coding-system 'utf-8)

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

<meta name="Content-Type" content="text/html; charset=UTF-8" />

在页面中。

但是我用notepad++将文件存储为utf-8后,浏览器就可以正确显示内容了。

所以我想更多地了解 Emacs 中的编码。

4

2 回答 2

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

关于物料清单:

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

  • 在 中utf-8,每个字符由一个字节表示(除了大于 127 的扩展字符,它们使用特殊的字节序列),因此指定字节顺序是无意义的,但这个签名无论如何对于检测 utf-8 文件而不是纯文本ASCII。utf-8 文件与 ascii 文件仅在扩展字符上有所不同,如果不解析整个文件,则无法检测到,直到找到一个伪 BOM 使其立即可见。(顺便说一句,Emacs 进行这种自动检测非常有效)

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

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

  • 在使用编码时获得一些额外的帮助,您可以参考这个补充答案“如何在 emacs 中查看编码”

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

于 2013-07-25T17:36:05.173 回答
2

这个问题不能多说,除了设置后

(prefer-coding-system 'utf-8)
(setq coding-system-for-read 'utf-8)
(setq coding-system-for-write 'utf-8)

2 年多来我没有遇到任何 unicode 问题。

于 2013-07-25T15:53:04.437 回答