C++ 代码判断无 BOM 的 UTF-8 和 GBK-2312 编码
#include
bool isUTF8(const std::string& file) { std::ifstream input(file, std::ios::binary); char c; int count = 0;
while (input.get(c)) {
if ((c & 0x80) == 0x00) {
// 0xxxxxxx,单字节UTF-8字符
continue;
} else if ((c & 0xE0) == 0xC0) {
// 110xxxxx 10xxxxxx,双字节UTF-8字符
count = 1;
} else if ((c & 0xF0) == 0xE0) {
// 1110xxxx 10xxxxxx 10xxxxxx,三字节UTF-8字符
count = 2;
} else if ((c & 0xF8) == 0xF0) {
// 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx,四字节UTF-8字符
count = 3;
} else {
// 非UTF-8编码
return false;
}
for (int i = 0; i < count; i++) {
if (!input.get(c) || (c & 0xC0) != 0x80) {
// UTF-8字符长度不匹配或格式不正确
return false;
}
}
}
return true;
}
bool isGBK2312(const std::string& file) { std::ifstream input(file, std::ios::binary); char c;
while (input.get(c)) {
if ((c & 0x80) == 0x00) {
// 0xxxxxxx,ASCII字符
continue;
} else if ((c & 0xFF) >= 0x81 && (c & 0xFF) <= 0xFE) {
// 高位字节在0x81-0xFE范围内,低位字节在0x40-0xFE范围内,GBK-2312字符
if (!input.get(c) || ((c & 0xFF) < 0x40 || (c & 0xFF) > 0xFE)) {
return false;
}
} else {
// 非GBK-2312编码
return false;
}
}
return true;
}
int main() { std::string file = "test.txt";
if (isUTF8(file)) {
std::cout << "UTF-8编码" << std::endl;
} else if (isGBK2312(file)) {
std::cout << "GBK-2312编码" << std::endl;
} else {
std::cout << "无法确定编码类型" << std::endl;
}
return 0;
}
请注意,此代码只是基于UTF-8和GBK-2312编码的特定规则进行判断,可能存在一些边界情况未处理。对于更复杂的编码判断需求,建议使用专门的库或工具。
原文地址: https://www.cveoy.top/t/topic/p8iG 著作权归作者所有。请勿转载和采集!