utf-8和gbk的转换_区位码转换器软件

(5) 2024-07-21 12:12

Hi,大家好,我是编程小6,很荣幸遇见你,我把这些年在开发过程中遇到的问题或想法写出来,今天说一说
utf-8和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数据库文件中的数据并显示的例子。















今天的分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。

上一篇

已是最后文章

下一篇

已是最新文章

发表回复