网上遍寻判断是否为gbk编码的方法,发现大家的方法都是一样的(很明显都是ctrl+c/ctrl+v),让我一度怀疑确实是字符串的编码出现了问题。如下所示:
func isGBK(data []byte) bool {
if isUtf8(data) {
return false
}
length := len(data)
var i int = 0
for i < length {
if data[i] <= 0x7f {
//编码0~127,只有一个字节的编码,兼容ASCII码
i++
continue
} else {
//大于127的使用双字节编码,落在gbk编码范围内的字符
if data[i] >= 0x81 &&
data[i] <= 0xfe &&
data[i+1] >= 0x40 &&
data[i+1] <= 0xfe &&
data[i+1] != 0xf7 {
i += 2
continue
} else {
return false
}
}
}
return true
}
但是很遗憾,这个方法中有个很致命的错误。这个错误导致消息中包含某一些字(比如“明“”)的时候,会导致判断出错。
在仔细观察了gbk编码表和gbk编码规则后,总算发现了问题所在。
出错的代码行是:
data[i+1] != 0xf7
这里应该改成
data[i+1] != 0x7f
至此问题解决。
希望大家在发表文章的时候能仔细一点,不然就特别容易误导别人。