这篇文章主要是将go语言实现的版本改为C/C++版本实现,主要思路是一样的,具体思路请看:
GO代码实现判断字符编码格式及编码格式转换(utf-8、gbk)
而本文更主要说明windows及linux平台下utf-8与gbk的转换。
判断是否是gbk
bool isGBK(unsigned char* data, int len) {
int i = 0;
while (i < len) {
if (data[i] <= 0x7f) {
//编码小于等于127,只有一个字节的编码,兼容ASCII
i++;
continue;
} else {
//大于127的使用双字节编码
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;
}
判断是否是utf-8
int preNUm(unsigned char byte) {
unsigned char mask = 0x80;
int num = 0;
for (int i = 0; i < 8; i++) {
if ((byte & mask) == mask) {
mask = mask >> 1;
num++;
} else {
break;
}
}
return num;
}
bool isUtf8(unsigned char* data, int len) {
int num = 0;
int i = 0;
while (i < len) {
if ((data[i] & 0x80) == 0x00) {
// 0XXX_XXXX
i++;
continue;
}
else if ((num = preNUm(data[i])) > 2) {
// 110X_XXXX 10XX_XXXX
// 1110_XXXX 10XX_XXXX 10XX_XXXX
// 1111_