自动检测汉字GB18030编码与UTF-8编码


先看看汉字的GB18030编码与UTF-8编码范围

GB18030
第1位:0x81 ~ 0xFE                        1000 0001 ~ 1111 1110
第2位:0x40 ~ 0x7E                        0100 0000 ~ 0111 1110
或 者:0x80 ~ 0xFE                        1000 0000 ~ 1111 1110


UTF-8
第1位:0xE0 ~ 0xEF                        1110 0000 ~ 1110 1111
第2位:0x80 ~ 0xBF                        1000 0000 ~ 1011 1111
第3位:0x80 ~ 0xBF                        1000 0000 ~ 1011 1111


想到如下特征来识别汉字
    1. 如果第1位是0就不需要判断的,一定是ASCII字符。
    2. 如果第1位是1开头的,第2位是0开头的,一定是GB编码。
    3. 如果第1位是非1110开头的,则一定是GB编码。
    4. 多做几个汉字判断。


考虑到判断效率,简要写了如下代码做判断即可达到基本效果:

/*
 * Get the character code type. (UTF-8 or GB18030)
 * @param s the string to be operator.
 * @return return the code type. (1 means UTF-8, 0 for GB18030, -1 for error)
 */
int get_character_code_type(const char* s)
{
	if (NULL == s)
	{
		return -1;
	}
	
	int i = 0;
	for(; s[i] != '\0'; i++)
	{
		// ASCII character.
		if (!(s[i] & 0x80))
		{
			continue;
		}
		// Hanzi utf-8 code possiable.
		else if(!( (s[i] & 0xF0) ^ 0xE0) 
				&& s[i+1] 
				&& !( (s[i+1] & 0xC0) ^ 0x80) 
				&& s[i+2] 
				&& !( (s[i+2] & 0xC0) ^ 0x80))
		{
			return 1;
		}
		// Not a UTF-8 code.
		else
		{
			return 0;
		}
	}
	
	return -1;
}


写一个测试例子来测试一下:

#include "char_code.h"
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdio.h>

int main(int argc, char* argv[])
{
	if (argc < 2)
	{
		printf("%s [file_path]\n", argv[0]);
		return -1;
	}
	
	// open file and read buf.
	int f = open(argv[1], O_RDONLY);
	if ( -1 == f )
	{
		fprintf(stderr, "file %s open failed.\n", argv[1]);
		return -1;
	}
	
	char buf[1024] = {0};
	read(f, buf, 1023);
	int ret = get_character_code_type(buf);
	fprintf(stdout, "char code type = %s\n", (ret == 1 ? "UTF-8" : "GB18030"));
	
	
	// close file.
	if ( 0 != close(f))
	{
		fprintf(stderr, "file %s close failed.\n", argv[1]);
		return -1;
	}
	
	return 0;
}

编译:

gcc test.c -o test -O0 -g3 -Wall

运行结果:

$ ./test gb18030.txt 
char code type = GB18030
$ ./test utf8.txt 
char code type = UTF-8


参考文献
    UTF-8编码检测失败特例
    http://www.kuqin.com/language/20071201/2740.html
    UTF-8文件的Unicode签名BOM(Byte Order Mark)问题
    http://blog.csdn.net/thimin/article/details/1724393
    UTF-8
    http://zh.wikipedia.org/zh-cn/UTF-8
    GB 18030
    http://zh.wikipedia.org/wiki/GB_18030

下载:

http://download.csdn.net/detail/firstboy0513/4137551


  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
GB2312编码UTF-8编码是两种不同的字符编码方案,它们各自有一些优点和缺点。 GB2312编码的优点: 1. 兼容性:GB2312编码是早期的中文字符编码方案,在一些老旧的系统和软件中有广泛应用,因此在这些环境下使用GB2312编码可以兼容性更好。 2. 简单性:相对于UTF-8,GB2312编码是一种比较简单的编码方案,使用的字符范围较小,编码方式相对简单。 GB2312编码的缺点: 1. 有限性:GB2312编码只包含了有限数量的汉字和非汉字字符,如果需要处理更多的字符,如繁体字、特殊符号等,就无法满足需求。 2. 不支持国际化:GB2312编码主要用于中文字符,对于其他语言的支持较弱,不适用于国际化应用。 UTF-8编码的优点: 1. 兼容性:UTF-8是一种通用的字符编码方案,在现代计算机和互联网环境中广泛应用,几乎所有操作系统、软件和浏览器都支持UTF-8。 2. 多语言支持:UTF-8编码可以表示几乎所有的字符,包括各种语言的字符、特殊符号、表情符号等,适用于多语言环境和国际化应用。 UTF-8编码的缺点: 1. 存储空间:UTF-8编码中一些字符会占用更多的存储空间,特别是对于一些非常罕见的字符或较少使用的字符,可能会占用比较高的存储空间。 2. 处理复杂性:相对于GB2312编码UTF-8编码在处理过程中可能稍微复杂一些,因为它需要考虑到字符的变长编码规则。 总的来说,GB2312编码适用于一些特定的旧系统和软件环境,而UTF-8编码则是更为通用和推荐的字符编码方案,特别适合多语言环境和国际化应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值