我读从流中的字节序列。 承担参数的缘故,该序列是一个固定的长度,并且我读整个事情到字节数组(在我的情况下,它vector<char>
但它并不重要为这个问题)。 该字节序列包含一个字符串,其中我的是无论是在UTF-16或UTF-8编码。 不幸的是,没有哪一个是指标。
我可以验证该字节序列是否代表有效UTF-16编码,并且还它是否代表有效的UTF-8编码,但我也可以成像字节的相同序列如何可以是有效的UTF-8和一个有效的UTF-16同时。
那么,这是否意味着没有办法一般弄清楚它是哪一个?
如果预期的内容,使用拉丁脚本语言编写,简单地计算空值将检测UTF-16。 在UTF-8,空字节会进行解码,以NUL控制字符,而且他们通常不会出现在文本。
除非是人工建造的是这么写的其他脚本语言不能在这两个UTF-16和UTF-8完全有效。
因此,首先检测是否是对自己完全合法的UTF-8序列:
- 如果是,检查空字节,如果有一些,这是UTF-16。 否则,它是UTF-8。
- 如果不是,它是UTF-16。
如果上述导致UTF-16,这还不够,你必须知道字节序也。 随着语言写成拉丁字母的奇数或偶数空字节量会告诉这个。
那么,这是否意味着没有办法一般弄清楚它是哪一个?
那就对了。 字节串[0x30, 0x30]
可以是UTF-8字符串00
或字符的UTF-16编码〰
。 这是一个波浪线,如果你想知道。
有几多个试探尝试:
- 您可以检查字符串是否以一个BOM (Windows程序爱那些),因为无论BOM是UTF-8序列的有效启动。
- 如果你确信没有NULL字符字符串中,则包含零个字节每个偶数长度字符串必须是UTF-16。
如果这些失败,你必须在两者-8和-16解码默认的任一选项,或做一些检查对字符串的内容。