#include #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编码的特定规则进行判断,可能存在一些边界情况未处理。对于更复杂的编码判断需求,建议使用专门的库或工具。

C++ 代码判断无 BOM 的 UTF-8 和 GBK-2312 编码

原文地址: https://www.cveoy.top/t/topic/p8iG 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录