这些是过时了吗?他们就像是有史以来最坏的想法 - 嵌入在文件中的内容,没有人能看到的东西,但影响文件的功能。我不明白为什么我会想要一个。

有帮助吗?

解决方案

他们在某些情况下有必要的,是的,因为有UTF-16的两个小端和大端的实现。

当读取一个未知的UTF-16文件,你怎么能分辨出哪两个被使用呢? 唯一的解决办法是把某种容易辨认标记的文件,它可以永远不会被误认为是别的中,无论岬端使用。

这就是BOM做什么。

和你需要吗?只有当你使用UTF编码,其中字节顺序是一个问题是1)(它事项UTF-16,但UTF8看起来总是不管字节顺序相同),的文件将被共享与外部应用程序。

如果您自己的应用程序是那将读取和写入文件只有一个,你可以省略BOM,并且简单地决定一劳永逸这ENDIANNESS你要使用。但是,如果另一个应用程序读取该文件,它不会提前知道字节序,所以加入BOM可能是一个不错的主意。

其他提示

UTF和BOM常见问题解答从Unicode联合会一些摘录可以是有帮助的。

  

问:什么是BOM

     

:一种字节顺序标记(BOM)由字符代码的U + FEFF 在其中它可以被用作签名的数据流,的开始限定的字节顺序和编码主要的未标记的纯文本文件的形式,。在某些更高级别的协议,使用一个BOM的可以是在协议中定义的Unicode数据流中的强制性的(或禁止的)。 (重点煤矿。)

我不会准确说字节顺序标记是嵌入式中的数据。相反,它的前缀的数据。字符只是一个字节顺序标记时,它在数据流中的第一件事情。在别的地方,以及它的的零宽度不间断空格的。支持Unicode的不尊敬字节顺序标记方案是不是真的由它的存在损害反正因为性格是无形的,和字木匠在文本块开始只加入一个字符不了了之,因此它没有效果。

  

问:在哪里是BOM有用

?      

答: BOM是在文件的开头所键入的文本是有用的,但它不知道他们是否在或大或小尾数格式,它也可以作为提示指示该文件是Unicode中,如在传统的编码相对,此外,它充当用于使用的特定编码形式的签名。

所以,你会希望有一个BOM,当你的程序能够处理的Unicode的多种编码。你的程序是怎么回事知道使用哪种编码解释其输入的时候?

  

问:当使用BOM,是其仅在16位Unicode文本

     

否,一个BOM可被用作Unicode文本是无论怎样转化的签名:UTF-16,UTF-8,UTF-7等含有确切字节BOM将任何Unicode字符U + FEFF由转换格式转换成。在这种形式中,BOM用于指示两个,这是Unicode文件,并且其格式是英寸

这可能在BOM目前使用最频繁的情况下。它区别于任何其他编码UTF-8编码的文本;它不是真正的标记字节,因为UTF-8只具有一个顺序的顺序。

如果你正在设计自己的协议或数据格式,你不需要使用一个BOM。从FAQ另一个问题涉及对:

  

问:我如何标记不解释U + FEFF作为BOM数据

     

:使用标签UTF-16BE指示大端UTF-16的文本,UTF-16LE来表示little-endian的UTF-16的文本。如果你使用一个BOM,标记文字简单地UTF-16。

它提到的标签的数据的格式的概念。这意味着从数据本身指定格式的出的带外。这是伟大的,如果这样的设施是提供给您,但它往往不是,特别是当被改造为统一的旧系统。

在BOM表示其中的Unicode编码的文件是,如果没有这种区别,一个unicode读者将不知道如何读取该文件。

然而,UTF-8不需要BOM。

查看维基百科文章

你这个标记使用UTF-8我会说,你并不需要一个BOM。 Byto顺序标记仅用于UTF-16和UTF-32有用,因为它通知计算机中的文件是否在大端或小端。一些文本编辑器可以使用字节顺序标记来决定什么编码文件的用途,但这不是Unicode标准的一部分。

在“BOM”是从Unicode的初期故障保持,当它被假定使用Unicode将意味着使用16位字符。它是在像UTF-8编码仅具有一个字节顺序完全没有意义的。 U + FEFF的选择也是不理想的为UTF-32,因为它可以不是所有可能的中间端字节订单区分(这样做将需要与4 不同字节编码的BOM)。

你会使用一个唯一的原因是不同的字节顺序的平台之间发送时UTF-16或UTF-32的数据,但是(1)大多数人使用UTF-8,无论如何,和(2)的MIME charset参数提供一个更好的机制。

和UTF16 UTF32可以写成两个大端和小端的形式。你可以尝试通过分析处理在任一字节序文件的结果,试探性地确定字节顺序,但为您节省一切打扰,该BOM可以告诉你的时候了。

UTF-8并不真的需要一个BOM来,因为你通过字节对其进行解码字节。

不管创建文本文件,它可能是值得的注意,当你阅读文本文件时,你是否使用这些自己。即检测和跳过(并且理想地相应处理)的BOM在文件的开头。我碰到几个其中有它和最初引起我的一些问题,直到我想通了什么事情。

如UTF16和UTF32的BOM告诉该内容是否是在大端或小端格式,并且还该内容是Unicode,使用UTF-8 BOM分类上述文件为UTF-8编码。如果没有UTF-8 BOM,你怎么能知道,如果它是一个ANSI文件或UTF-8编码的文件?在UTF-8 BOM没有告诉当然字节序,因为UTF-8是始终字节流,但它告诉如果内容是UTF-8编码的Unicode或ANSI。当然,你可以扫描有效UTF-8序列,但在我看来,它更容易检查文件的前三个字节。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top