UTF-16LE与UTF32-LE的Unicode BOM

Edw*_*per 8 unicode byte-order-mark file-type utf-16 character-encoding

看起来用于UTF16-LE和UTF-32LE的字节顺序标记之间存在歧义.特别是,考虑一个包含以下8个字节的文件:

FF FE 00 00 00 00 00 00
Run Code Online (Sandbox Code Playgroud)

如何判断此文件是否包含:

  1. UTF16-LE BOM(FF FE)后跟3个空字符; 要么
  2. UTF32-LE BOM(FF FE 00 00)后跟一个空字符?

Unicode BOMs在这里描述:http://unicode.org/faq/utf_bom.html#bom4但是没有讨论这种歧义.我错过了什么吗?

Mar*_*ers 11

顾名思义,BOM仅告诉您字节顺序,而不是编码.您必须首先知道编码是什么,然后您可以使用BOM来确定最小或最重要的字节是否是多字节序列的第一个.

BOM的一个幸运的副作用是,如果您不知道它,有时也可以使用它来猜测编码,但这不是它的设计目的,它不能替代发送正确的编码信息.


Dus*_*tin 9

这是明确的. FF FE适用于UTF-16LE,FF FE 00 00表示UTF-32LE.没有理由认为FF FE 00 00可能是UTF-16LE,因为UTF是为文本设计的,用户不应该在文本中使用NUL字符.毕竟,你最后一次打开一个十六进制编辑器并在文本文档中插入几个00字节的时候是什么时候?^ _ ^

  • 空字符很可能是文本中编码的高阶协议的一部分.Unicode实际上并不关心文本中使用的代码点,U + 0000与U + 0041一样有效. (5认同)
  • 阅读更高阶的协议,这个理论与必须猜测编码的问题设置相冲突.如果您正在阅读协议,则不要猜测编码. (3认同)