UTF8和gbk编码转换(一)

在项目中,经常遇到将gbk编码与utf8编码进行转换的情况。如在linux系统中对windows下文件进行操作,或是windows下对Linux文件操作。这是因为在Windows下的默认字符编码格式是GBK(GB2312),而Linux下是UTF-8。

UTF-8:Unicode Transformation Format-8bit,是用以解决国际上字符的一种多字节编码,它对英文使用8位(一个字节),中文使用24位(三个字节)来编码。UTF-8包含全世界所有国家需要用到的字符,是国际编码,通用性强。

GBK:是国家标准GB2312基础上扩展后兼容GB2312的标准。GBK的文字编码是用双字节来表示的,即不论中、英文字母均使用双字节来表示,为了区分中文,将其最高位都设定为1。GBK包含全部中文字符,是国家编码。通用性比UTF8差,但UTF8占用的数据库比GBK大。

严格来讲,GBK和UTF-8的概念不在一个层次上,GBK和Unicode都是字符的编码方式,而UTF-8、UTF-16、UTF-32只是Unicode的一种表现方式,从下面的例子可以直观的了解它们的区别,“汉字”对应的数字是0x6c49和0x5b57,而编码的程序数据是:

char data_utf8[] = {0xE6, 0xB1, 0x89, 0xE5, 0xAD, 0x97}; // UTF-8编码
char16_t data_utf16[] = {0x6C49, 0x5B57}; // UTF-16编码
char32_t data_utf32[] = {0x00006C49, 0x00005B57}; // UTF-32编码

因为UTF-8码完全只针对Unicode来组织的,所以GBK与UTF-8之间的转换必须以Unicode做中转。在不同的系统下封装好了函数以供方便转码。

Windows下:
1.在Windows下可以用函数MultiByteToWideChar先将多字节字符转换为Unicode;

2.使用WideCharToMultiByte将Unicode再转换为UTF-8。

/************************************************************/
//求根页函数
int rootpage( char *sql,char *path)
{
    sqlite3 *db = 0;
    char *pErrMsg = 0;
    int ret = 0;

	/******************将路径从GBK转为UTF8编码,sqlite3_open()编码方式UTF8**************************/

	int nRetLen = 0;

	nRetLen = MultiByteToWideChar(CP_ACP,0,path,-1,NULL,NULL); //获取转换到Unicode编码后所需要的字符空间长度
	wchar_t *unicode=(wchar_t *)calloc(sizeof(wchar_t),nRetLen+1);
	MultiByteToWideChar(CP_ACP,0,(char *)path,-1,unicode,nRetLen); //转换到Unicode编码

	nRetLen = WideCharToMultiByte(CP_UTF8,0,unicode,-1,NULL,0,NULL,NULL); //获取转换到UTF8编码后所需要的字符空间长度
	char *utf8Path=(char *)calloc(sizeof(char),nRetLen+1);
	WideCharToMultiByte(CP_UTF8,0,unicode,-1,utf8Path,nRetLen,NULL,NULL); //转换到UTF8编码
	/***********************************************************************************************/

    ret = sqlite3_open(utf8Path,&db);
    if ( ret != SQLITE_OK )
	 { 
          printf( "无法打开数据库:\n");
          return(-1);
        } 
    //else
	//    printf("数据库连接成功!\n");
    sqlite3_exec(db,sql,rootpage_callback,0,&pErrMsg);
    sqlite3_close(db);
    db=0;
    return _rootpage;
}
/************************************************************/


以上例子是利用sqlite3_open()函数打开一个数据库,但Windows下file的fullname可能包含有中文字符,需要先将fillname字符串转为UTF-8编码方式。

/**************************************************************************/
//将得到的已删除信息转码成GBK后分行存储打印
void allot_content(unsigned char string[],int size,unsigned char offset[],unsigned char content[][1000])
{
	int i = 0;
	int j = 0;
	int strLen = 0;
	int resultLen = 0;
	int length = 2000;
	struct memory_info
    {
		unsigned char content[1000];
	}buffer[30];

	WCHAR unicode_content[1000];

	while(j<size)
	{
		while(!((string[j] == offset[0])&&(string[j+1] == offset[1]))&&(j<size))
		{
			buffer[i].content[strLen++] = string[j];
			j++;
		}
		buffer[i].content[strLen] = '\0';
		j += 3;
		strLen = 0;
		//UTF8toUnicode
		resultLen = MultiByteToWideChar(CP_UTF8,0,(char *)buffer[i].content,-1,unicode_content,length);
		unicode_content[resultLen] = '\0';
		//printf("%s\n",unicode_content);
		//UnicodetoGBK
		WideCharToMultiByte(CP_ACP,0,unicode_content,-1,(char *)content[line++],length,NULL,NULL);
		//printf("gbk转码后:\n%s\n",content[line-1]);
	}
}
/**************************************************************/


以上例子是在Windows下读取sqlite数据库文件中的数据并显示的例子。















  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值