注册 登录
编程论坛 C语言论坛

求助: 编码-如何区分 [ANSI] 和 [无BOM的UTF8] 这两种编码

追梦人zmrghy 发布于 2022-09-10 14:26, 2311 次点击
编码-如何区分 [ANSI] 和 [无BOM的UTF8] 这两种编码

ANSI 936 GBK 2个字节 表示一个汉字。
无BOM的UTF8  3个字节 表示一个汉字。

C++如何区分 文本文件是GBK还是无BOM的UTF8
不要告诉我显示出来,看是不是乱码就知道了。。。。

11 回复
#2
op1232022-09-10 14:40
https://blog.
可以看看
#3
追梦人zmrghy2022-09-10 15:11
回复 2楼 op123
还是没有用呀!!!
没说明C++ 如何区分 [ANSI] 和 [无BOM的UTF8] 这两种编码
#4
chenyucheng2022-09-10 20:27
如果好多的都是按照UTF-8规则,那么utf-8,否则
如果好多的都是按照GBK规则,那么GBK,否则一般选择是GBK。
#5
追梦人zmrghy2022-09-10 20:35
回复 4楼 chenyucheng
如何让程序,自动识别
#6
不会游泳的虾2022-09-10 20:36
知乎上一个问答,供参考:https://www.
#7
追梦人zmrghy2022-09-10 22:42
回复 6楼 不会游泳的虾
有BOM的好区分。
无BOM的UTF-8和ANSI如何区分。。。。
#8
op1232022-09-11 16:56
懵了
#9
吹水佬2022-09-11 17:09
UTF-8以8bit为单元可变长的一种多字节编码字符集
表示一个Unicode字符时,它可以是1个至多个字节
编码规则:
1字节:0xxxxxxx
2字节:110xxxxx 10xxxxxx
3字节:1110xxxx 10xxxxxx 10xxxxxx
4字节:11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
..........
可以按编码规则去判断
#10
chenyucheng2022-09-11 20:44
回复 5楼 追梦人zmrghy
UTF-8 规则:
程序代码:
UTF-8 用一到四个字节表示字符。
一个字节:0*******                            (7位)
两个字节:110***** 10******                   (11位)
三个字节:1110**** 10****** 10******          (16位)
四个字节:11110*** 10****** 10****** 10****** (21位)
以此类推,理论上最多能到六个字节(第一个字节已经是1111110*),但由于Unicode范围是U+0000到U+10FFFF(0x10FFFF=十进制1114111=长21位的二进制10000 11111111 11111111),所以最多四个字节足矣。

(其中星号部分表示Unicode的二进制码,并且全都用二进制表示编码,除了U+和0x开头的是十六进制)

[此贴子已经被作者于2022-9-11 20:57编辑过]

#11
TsXor2022-11-07 20:07
根据楼上叙述的utf-8的特征,可以这样鉴定一段unsigned char*是不是utf-8编码(瞎写的,不知道能不能编译)
程序代码:
unsigned char heading_ones(unsigned char n) {
    unsigned char i = 0;
    while ((n << i) & 0b10000000) i++;
    return i
}
bool isutf8(unsigned char* data, size_t len){ // len是整个unsigned char*的长度(读取的byte数),不是字符数
    size_t i = 0; unsigned char offset;
    while (i < len) {
        offset = heading_ones(data[i]);
        if (offset) {
            // 以n个1开头,占n个byte
            for (size_t j = i + 1; j < i + offset; j++) {
                // 如果在这个字符的范围内有一个字节开头不是10,那就不是utf-8
                if (data[j] & 0b11000000 != 0b10000000) return false;
            }
            i += offset;
        } else {
            // 以0开头,占一个byte
            i++;
        }
    }
    return true; // 有可能这段数据的编码不是utf-8,但至少它符合这个编码的标准
}


楼上有玩python的,其实在python里头这事更简单(因为轮子多)
程序代码:
with open(r'文件路径', 'rb') as fp:
    fbytes = fp.read()
    try:
        _ = fbytes.decode()
        print('是utf-8编码')
    except UnicodeDecodeError:
        print('不是utf-8编码')



[此贴子已经被作者于2022-11-7 20:10编辑过]

#12
TsXor2022-11-07 20:25
或者就像楼上贴的知乎回答链接里说的一样,uchardet解君愁:
https://
1