首先关于两者的字符编码方式可以参考:编码
然后关于第一点,如何通过字节数据层面判断是GBK还是Unicode字符集(UTF-8编码)?答案是做不到,因为两者有重叠,下面详细说明原因。
网上有些对GBK和UTF-8编码判断的方法(比如:C++代码判断字符编码类型及编码格式转换(utf-8、gbk)或C++代码判断字符编码类型及编码格式转换(utf-8、gbk)),主要是通过字节数据的范围判断,且由于GBK的每个字节都在UTF-8的范围内,所以需要先判断是否为UTF-8,然后再判断是否为GBK。然而这样还是会出问题。
比如:
对于中文‘鍟’的GBK编码时0xE595,而中文‘夽’的GBK编码时0x8A40,那么按照UTF-8的解析,会将这四个字节0xEA958A40,分成0xEA 95 8A 和0x40两个,对应UTF-8的中文‘啊’以及‘@’两个字符。
类似的场景还是有很多的。。。