为什么我要使用Unicode签名字节顺序标记(BOM)?

Pup*_*Pup 8 unicode encoding byte-order-mark utf-8

这些已经过时了吗?它们似乎是有史以来最糟糕的想法 - 在文件的内容中嵌入了一些无人能看到的内容,但会影响文件的功能.我不明白为什么我会想要一个.

jal*_*alf 17

在某些情况下,它们是必要的,是的,因为UTF-16有little-endian和big-endian实现.

读取未知的UTF-16文件时,如何判断使用哪两个?唯一的解决方案是在文件中放置某种易于识别的标记,无论使用何种字节顺序,都不会将其误认为是其他任何标记.

这就是BOM的作用.

你需要一个吗?只有当你1)使用UTF编码时才会出现字节顺序问题(对UTF-16很重要,但无论字节顺序如何,UTF8总是看起来都一样),并且该文件将与外部应用程序共享.

如果您自己的应用程序是唯一一个将要读取和写入文件的应用程序,您可以省略BOM,并简单地一劳永逸地决定您要使用哪个字节序.但是如果另一个应用程序必须读取该文件,它将不会提前知道字节序,因此添加BOM可能是个好主意.

  • @tchrist:嗯,是的.它们在7位ASCII或JPG图像中也不需要.这就是我的答案明确谈到UTF-16的原因. (5认同)
  • UTF-8不需要BOM.它搞砸了.想象一下`cat file1 file2 file3> file123`. (3认同)

Rob*_*edy 9

来自Unicode Consortium 的UTF和BOM FAQ的一些摘录可能会有所帮助.

问:什么是BOM?

答:字节顺序标记(BOM)由数据流开头的字符代码U + FEFF组成,它可以用作定义字节顺序和编码形式的签名,主要是未标记的明文文件.在某些更高级别的协议下,在该协议中定义的Unicode数据流中可能必须(或禁止)使用BOM.(强调我的.)

我不确切地说字节顺序标记嵌入在数据中.相反,它为数据添加前缀.当字符是数据流中的第一个字符时,该字符只是一个字节顺序标记.在其他任何地方,它都是零宽度的不间断空间.不支持字节顺序标记的Unicode感知程序不会因为它的存在而受到真正的伤害,因为该字符是不可见的,并且文本块开头的单词连接器只是将下一个字符连接到任何东西,所以没有效果.

问:BOM在哪里有用?

答: BOM在输入为文本的文件的开头很有用,但是不知道它们是大端还是小端格式 - 它也可以作为提示指示文件是Unicode,如与遗留编码相反,此外,它充当所使用的特定编码形式的签名.

因此,当您的程序能够处理多种Unicode编码时,您需要BOM.您的程序如何知道在解释其输入时使用哪种编码?

问:使用BOM时,是否仅使用16位Unicode文本?

答:不可以,无论Unicode文本如何转换,BOM都可以用作签名:UTF-16,UTF-8,UTF-7等.构成BOM的确切字节将是Unicode字符U + FEFF由转换格式转换.在该表单中,BOM用于指示它是Unicode文件以及它所处的格式.

这可能就是今天最频繁使用BOM的情况.它将UTF-8编码的文本与任何其他编码区分开来; 它并没有真正标记字节的顺序,因为UTF-8只有一个订单.

如果您正在设计自己的协议或数据格式,则无需使用BOM.常见问题中的另一个问题涉及到:

问:如何标记不将U + FEFF解释为BOM的数据?

答:使用标签UTF-16BE表示big-endian UTF-16文本,使用UTF-16LE表示little-endian UTF-16文本.如果您使用BOM,请将文本标记为UTF-16.

它提到了标记数据格式的概念.这意味着指定格式外的带从数据本身.如果您可以使用这样的工具,那就太好了,但通常情况下并非如此,特别是在为旧系统进行Unicode改造时.


Jos*_*eph 5

BOM 表示文件采用哪种 Unicode 编码。如果没有这种区别,unicode 读取器将不知道如何读取文件。

但是,UTF-8 不需要 BOM。

查看维基百科文章

  • 美国标准协会?为什么 \*nix 软件会将任何东西视为 ANSI?这是微软主义,意思是“ASCII 的几个 8 位扩展之一,但你必须猜出是哪一个”。\*nix 软件更有可能采用 ASCII 或 UTF-8 *不带 BOM*,Unicode 联盟不鼓励使用它们。 (4认同)
  • @Bob:为什么“cat”需要关心编码是什么? (2认同)