emacs - emacs中各种类型的 'utf-8'有什么区别

标签 emacs unicode encoding

在 Emacs 中,输入后

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

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

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

我用谷歌搜索过,但找不到正确的答案。

附注

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

(prefer-coding-system 'utf-8)

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

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

在页面中。

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

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

最佳答案

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

  • -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,或:C-hC

关于 BOM:

  • utf 标准定义了一个特殊签名,放置在(文本)文件的开头,以区分 utf-16 编码字节的顺序(如 utf-16存储 2 个字节(或 16 位)或字节顺序的字符:某些系统将最高有效字节放在前面(大端 -> utf-16be),而另一些则将最低有效字节放在前面(小端)字节序 -> utf-16le)。该签名称为BOM:字节顺序标记

  • utf-8 中,每个字符都由一个字节表示(大于 127 的扩展字符除外,它们使用特殊的字节序列),从而指定一个字节order 是无稽之谈,但这个签名无论如何对于检测 utf-8 文件而不是纯文本 ascii 很有用。 utf-8 文件与 ascii 文件的区别仅在于扩展字符,如果不解析整个文件,就不可能检测到这一点,直到找到一个伪 BOM 使其立即可见为止。 (顺便说一句,Emacs 进行此类自动检测非常高效)

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

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

  • 在使用编码时需要一些额外的帮助,您可以引用 this complementary answer "How to see encodings in emacs"

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

关于emacs - emacs中各种类型的 'utf-8'有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17862846/

相关文章:

python - 如何在 OS X 上的 Emacs 中设置 Python 解释器?

突出显示 Lisp 形式的 Emacs 模式

emacs - 如何使用 GNU Emacs 修改 XPM 镜像?

testing - 我需要一个无法使用多个代码页正确转换为 ANSI 的字符串

Python 字符串打印为 [u'String']

emacs - 如何在Emacs中设置编译的默认目录?

unicode - 如何在 Tkinter 中打印非 BMP Unicode 字符(例如 𝄫)

python - 使用 python 在 XML 文件中编码表情符号

vb6 - 加密可打印文本,使结果仍然可打印(可以输入)

c# - TextBox 在 '\0' 字符处截断字符串