UTF-8 与带 BOM 的 UTF-8 对比

UTF-8 与带 BOM 的 UTF-8 对比

最新的 Notepad.exe 具有另存为UTF-8和功能UTF-8 with BOM

UTF-8 with BOM旧的吗UTF?现在是什么UTF-8

答案1

无论是否存在 BOM,UTF-8 都是 UTF-8。

对于 UTF-8 来说,使用 BOM(字节顺序标记)保存文件实际上并不是必需的。

Notepad 允许以“UTF-8”或“带 BOM 的 UTF-8”保存文件,这似乎是在需要 BOM(字节顺序标记)的情况下提供灵活性的一种选择。但一般来说,只保存不带 BOM 的文件(即纯 UTF-8)才是处理包含 UTF-8 内容的文本文件的最佳方式。

正如所解释的那样字节顺序标记的维基百科页面

“BOM 的使用是可选的。它的存在会干扰软件对 UTF-8 的使用,因为这些软件不希望文件开头出现非 ASCII 字节,但可以处理文本流。”

这篇文章深入探讨了这一点,并陈述了以下内容;粗体强调部分是我所加的:

“BOM 的 UTF-8 表示形式是(十六进制)字节序列0xEF,0xBB,0xBF

Unicode 标准允许在 UTF-8 中使用 BOM,但不要求或建议使用。字节顺序在 UTF-8 中没有任何意义,因此它在 UTF-8 中的唯一用途是在开始时发出信号,表明文本流是用 UTF-8 编码的,或者它是从包含可选 BOM 的流转换为 UTF-8 的。标准也不建议在有 BOM 时将其删除,这样编码之间的往返不会丢失信息,并且依赖它的代码可以继续工作。IETF 建议,如果协议 (a) 始终使用 UTF-8,或 (b) 有其他方式指示正在使用的编码,则“应禁止使用 U+FEFF 作为签名”。

不使用 BOM 可使文本与某些不支持 Unicode 的软件向后兼容。示例包括允许在字符串文字中使用非 ASCII 字节但不允许在文件开头使用非 ASCII 字节的编程语言。”

至于为什么微软关心在记事本中保存带有 BOM 的 UTF-8?这很好地解释了这一点;似乎是微软编程工具的特定要求,而不是任何其他非微软工具:

“Microsoft 编译器和解释器以及 Microsoft Windows 上的许多软件(例如记事本)都将 BOM 视为必需的魔法数字,而不是使用启发式方法。这些工具在将文本保存为 UTF-8 时会添加 BOM,并且除非存在 BOM 或文件仅包含 ASCII,否则无法解释 UTF-8。Google Docs 在将文档转换为纯文本文件以供下载时也会添加 BOM。”

因此,除非您明确需要保存为文件设置 BOM 的 UTF-8 文件,否则不必担心该保存选项。

答案2

另一个答案是错误的。这是一些政治问题。ANSI 是 Windows 中的默认文本格式,已有 36 年历史。

在 Windows 中,文件被假定为 ANSI。因此您始终使用 BOM。无法处理 BOM 的 Unix 程序不符合 Unicode 标准。

我编写文本编辑器。如果用户未指定,则始终为 ANSI。

假设你将获得无 BOM Unicode 意味着你必须调用https://docs.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-istextunicode猜测格式。这几乎不是一个正确的编程。

相关内容