gbk联通
此方法不能正确识别gbk"联通",存在误认为是UTF8的BUG。
其实最好的检测做法是直接把UTF8转码成UTF32或UTF16,这样就可以正确识别无BOM的UTF8了,大大减小了误判的概率。
至于UTF8转UTF32或UTF16的算法,我这里就不发了,我就发个使用WinAPI来转码的简单例子就行了:
int UTF16长度 = MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, u8"UTF8字符串", UTF8长度, nullptr, 0); // 建议:UTF8长度 把\0结束标记一起算进去,比如 u8"UTF8字符串" 算14长,而不是13长,这样的话哪怕UTF8是空串,在转换成功时至少也会返回1,就可以保证返回0一定是转换失败的。
以上代码在第二个参数中加入了 MB_ERR_INVALID_CHARS 标记,该标记表示如果遇到不符合 UTF8 规则的字符就返回失败,因此该标记可以用来实现无BOM UTF8检测(经过测试,该方法检测gbk的"联通"是一定会失败的,因此可以正确区分UTF8和GBK)。
第5个参数是用来接收转换结果的,我们这里只需要检测字符串是不是UTF8,因此不需要接收传 nullptr 就行了。所以第6个缓冲区长度也相应的要填0(都没有缓冲区,裆燃长度得0嘛)。
|