检查字节序列包含UTF-16(Check if byte sequence contains utf

2019-07-17 22:32发布

我读从流中的字节序列。 承担参数的缘故,该序列是一个固定的长度,并且我读整个事情到字节数组(在我的情况下,它vector<char>但它并不重要为这个问题)。 该字节序列包含一个字符串,其中我的是无论是在UTF-16或UTF-8编码。 不幸的是,没有哪一个是指标。

我可以验证该字节序列是否代表有效UTF-16编码,并且还它是否代表有效的UTF-8编码,但我也可以成像字节的相同序列如何可以是有效的UTF-8和一个有效的UTF-16同时。

那么,这是否意味着没有办法一般弄清楚它是哪一个?

Answer 1:

如果预期的内容,使用拉丁脚本语言编写,简单地计算空值将检测UTF-16。 在UTF-8,空字节会进行解码,以NUL控制字符,而且他们通常不会出现在文本。

除非是人工建造的是这么写的其他脚本语言不能在这两个UTF-16和UTF-8完全有效。

因此,首先检测是否是对自己完全合法的UTF-8序列:

  • 如果是,检查空字节,如果有一些,这是UTF-16。 否则,它是UTF-8。
  • 如果不是,它是UTF-16。

如果上述导致UTF-16,这还不够,你必须知道字节序也。 随着语言写成拉丁字母的奇数或偶数空字节量会告诉这个。



Answer 2:

那么,这是否意味着没有办法一般弄清楚它是哪一个?

那就对了。 字节串[0x30, 0x30]可以是UTF-8字符串00或字符的UTF-16编码 。 这是一个波浪线,如果你想知道。

有几多个试探尝试:

  • 您可以检查字符串是否以一个BOM (Windows程序爱那些),因为无论BOM是UTF-8序列的有效启动。
  • 如果你确信没有NULL字符字符串中,则包含零个字节每个偶数长度字符串必须是UTF-16。

如果这些失败,你必须在两者-8和-16解码默认的任一选项,或做一些检查对字符串的内容。



文章来源: Check if byte sequence contains utf-16