顺晟科技
2021-08-28 09:39:16
216
Sqlite3的默认编码是UTF8编码,而UTF8编码中的中文不是按拼音顺序编码,因此要解决中文排序问题,请自定义排序规则,将UTF8编码转换为GB2312编码(GB2312编码的中文是按拼音顺序编码),然后比较大小,以获得正确的排序结果。
#include 'sqlite3.h '
#include
#include string
#include
Using std:vector
Using std:string
# pragma comment (lib,“sqlite3.lib”)
//UTF-8到GB2312的转换
Void u2g (constchar * utf8、stringgb2312)
{ intlen=multibytetowidechar(CP _ utf8,0,utf 8,-1,null,0);wchar _ t * wstr=new wchar _ t[len 1];meset(WSTR,0,LEN 1);Multibytetowidechar (CP _ utf8,0,utf8,-1,wstr,len);Len=widechartomultibyte (CP _ ACP,0,wstr,-1,null,0,null,null);char * str=new char[len 1];meset(STR,0,LEN 1);Widechartomultibyte (CP _ ACP,0,wstr,-1,str,len,null,null);删除IF(WSTR)[]WSTR;Gb2312=strDelete[]STR;
}
//GB2312到UTF-8的转换
Void g2u (constchar * gb2312,字串utf8)
{ intlen=multibytetowidechar(CP _ ACP,0,gb2312,-1,null,0);wchar _ t * wstr=new wchar _ t[len 1];meset(WSTR,0,LEN 1);Multibytetowidechar (CP _ ACP,0,gb2312,-1,wstr,len);len=widechartomultibyte(CP _ utf 8,0,wstr,-1,null,0,null,null);char * str=new char[len 1];meset(STR,0,LEN 1);Widechartomultibyte (CP _ utf8,0,wstr,-1,str,len,null,null);删除IF(WSTR)[]WSTR;Utf8=strDelete[]STR;
}
Intchinese _ CMP (void * not used、intnkey1、constvoid * pkey1、intnkey2、constvoid * pkey2)
{//int n=nKey1 nKey1?NKey1 : nKey2String key1=String key2=U2g ((char *) pkey 1,键1);U2g ((char *) pkey 2,键2);//returnstrncmp(键1.c _ str(),键2.c _ str(),n1);Returnstrcmp(键1.c _ str(),键2 . c _ str());
}
Void main()
{ sqlite3 * connintret=SQLite 3 _ open(' c 3360 \ \ users \ \ administrator \ \ desktop \ \ testsort . db ')String SQL=G2U(‘select * from mzh rd order by XM collate Chinese’,SQL);Sqlite3 _ stmt * stmtRet=sqlite3 _ prepare _ v2 (conn,sql.c _ str(),sql.length(),stmt,0);While(sqlite3_step(stmt))!=SQLITE _ DONE){ string data=' ';u2G((char *)SQLite 3 _ column _ text(stmt,0),数据);INT AFSD=1;} int DSAF=1;
}
08
1972-02
21
2022-04
05
2022-03
29
2021-08
29
2021-08
29
2021-08