判断一段文件是UTF-8编码还是GB2312的编码方式
来源:互联网 发布:慢走丝编程 编辑:程序博客网 时间:2024/04/30 08:23
对于只包含中文和英文的文本中判断编码方式是非常简单的,中文的编码方式最常用的是GBK,字符集更大的如GBK向下兼容GB2312,其中包含的的很多一部分字符是我们在日常生活中用不到的,因此在实际中我们一般只需要区分GB2312和UTF8编码。这里我只是提供一种可行的方法,如果判断GBK也可以采用类似的方式首先分析一下汉字在GB2312中的编码方式,gb2312规则汉字采用双字节编码其中第一字节161~247,第二字节161~254,其中含有边界条件。而utf8的编码方式可以看如下表示:
十六进制
二进制
二进制/十六进制
128个代码00000000 00000000 0zzzzzzz0zzzzzzz(00-7F)ASCII字符范围,字节由零开始七个z七个z000080 - 0007FF
1920个代码00000000 00000yyy yyzzzzzz110yyyyy(C0-DF) 10zzzzzz(80-BF)第一个字节由110开始,接着的字节由10开始三个y;二个y;六个z五个y;六个z000800 - 00D7FF
00E000 - 00FFFF
61440个代码 [Note 1]00000000 xxxxyyyy yyzzzzzz1110xxxx(E0-EF) 10yyyyyy 10zzzzzz第一个字节由1110开始,接着的字节由10开始四个x;四个y;二个y;六个z四个x;六个y;六个z010000 - 10FFFF
1048576个代码000wwwxx xxxxyyyy yyzzzzzz11110www(F0-F7) 10xxxxxx 10yyyyyy 10zzzzzz将由11110开始,接着的字节由10开始这样我们就可以由编码方式上的差异来进行GB2312和UTF8编码识别,下面给出代码
unsigned int countGBK(const char * str){assert(str != NULL);unsigned int len = (unsigned int)strlen (str); unsigned int counter = 0; unsigned char head = 0x80;unsigned char firstChar, secondChar;for (unsigned int i = 0; i < len - 1; ++i){firstChar = (unsigned char)str[i];if (!(firstChar & head))continue;secondChar = (unsigned char)str[i];if (firstChar >= 161 && firstChar <= 247 && secondChar>=161 && secondChar <= 254){counter+= 2;++i;}}return counter;}unsigned int countUTF8(const char * str){assert(str != NULL);unsigned int len = (unsigned int)strlen (str); unsigned int counter = 0; unsigned char head = 0x80;unsigned char firstChar;for (unsigned int i = 0; i < len; ++i){firstChar = (unsigned char)str[i];if (!(firstChar & head))continue;unsigned char tmpHead = head;unsigned int wordLen = 0 , tPos = 0;while (firstChar & tmpHead){++ wordLen;tmpHead >>= 1;}if (wordLen <= 1)continue; //utf8最小长度为2wordLen --;if (wordLen + i >= len)break;for (tPos = 1; tPos <= wordLen; ++tPos){unsigned char secondChar = (unsigned char)str[i + tPos];if (!(secondChar & head))break;}if (tPos > wordLen){counter += wordLen + 1;i += wordLen;}}return counter;}bool beUtf8(const char *str){ unsigned int iGBK = countGBK(str);unsigned int iUTF8= countUTF8(str);if (iUTF8 > iGBK)return true;return false;}
countUTF8和countGBK分别是为了在文本中数符合UTF8编码和GB2312编码方式的字的数量,beUtf8则看哪种编码方式覆盖了更多的字符,则认为该文本属于哪种字符集。注意从编码方式可以看出有部分GB2312编码方式和UTF8编码是冲突的,例如以C0和C1开头的汉字和UTF8编码方式重叠,所有if (iUTF8 > iGBK)return true;这个判断语句有没有等号则偏向于哪种方式在文本中更常用,如果含有等号,例如在识别“图片”这个词时编码会被误识别为utf8编码。
- 判断一段文件是UTF-8编码还是GB2312的编码方式
- 判断一段文件是UTF-8编码还是GB2312的编码方式
- 判断一段文件是UTF-8编码还是GB2312的编码方式
- 如何自动识别判断url中的中文参数是GB2312还是Utf-8编码
- 自动识别判断url中的中文参数是GB2312还是Utf-8编码
- 如何判断一个文件的编码格式是gb2312还是gbk等
- 字符编码的选择——UTF-8还是GB2312?
- 项目开发时的编码选择,utf-8还是gb2312
- 判断文件是否是UTF-8编码
- 做网站用UTF-8编码还是GB2312编码?
- 做网站用UTF-8编码还是GB2312编码?
- 做网站用UTF-8编码还是GB2312编码?
- 做网站用UTF-8编码还是GB2312编码?
- 做网站用UTF-8编码还是GB2312编码?
- 做网站用UTF-8编码还是GB2312编码?
- 判断一个字符串编码是utf-8还是gbk
- 编码方式GBK、GB2312、UTF-8的区别
- 字符编码 Unicode UTF-8,GB2312,shift-jis编码判断。
- ORA-27101: shared memory realm does not exist 错误的处理
- 高性能Socket服务器编程
- 图结构(GraphStructure) 探讨
- 华为校招上机题
- 通过例子说明CMMI各级别不同
- 判断一段文件是UTF-8编码还是GB2312的编码方式
- mysql源码1
- Linux 2.6.30 内核文件文件系统剖析
- C++代码案例
- 广告
- 开篇的话
- CentOS上可用的nginx启动脚本
- Oracle Enterprise Manager 组件 说明
- CGI如何用C控制sqlite3?