由于sqlite3支持UTF-16,所以创建数据的时候编码方案选择UTF16而不是UTF8。
创建表然后添加数据使用下面的代码即可读出中文。他是visual studio 2008创建智能设备程序在windows ce 5.0下测试ok!
sqlite3* db;
sqlite3_stmt *stat;
const unsigned char* ctemp;
const unsigned char* ctemp2;
const char* temp;
DWORD dwtimer,dwend;
LPCTSTR llll = NULL;
dwtimer = GetTickCount();
sqlite3_open("\\Windows\\WB98F.DIC",&db);
int result;
if(db)
{
/*result = sqlite3_exec(db,"create table image (filename varchar(128) unique,img blob);",&szerrormsg);*/
result = sqlite3_prepare(db,"SELECT encode,chtext FROM ime limit 1",-1,&stat,NULL);
if(result == sqlITE_OK)
{
while(sqlite3_step(stat) == sqlITE_ROW)
{
temp = (char*)sqlite3_column_text(stat,0);
llll = (LPCTSTR)sqlite3_column_text16(stat,1); //必须使用带16的函数,它支持UTF16使用上面的函数读出的仍旧是UTF8。他默认是UTF8的格式。
}
sqlite3_finalize(stat);
}
else
{
temp = sqlite3_errmsg(db);
}
sqlite3_close(db);
dwend = GetTickCount();
}
printf("%d\n",dwend-dwtimer);
printf("%s\n",ctemp);
return 0;
//下面摘自网上
首先,我们说的unicode,其实就是utf-16,但最通用的却是utf-8,原因: 我猜大概是英文占的比例比较大,这样utf-8的存储优势比较明显,因为utf-16是固定16位的(双字节),而utf-8则是看情况而定,即可变长度,常规的128个ASCII只需要8位(单字节),而汉字需要24位 UTF-16,UTF-16LE,UTF-16BE,及其区别BOM 同样都是unicode,为什么要搞3种这么麻烦? 先说UTF-16BE (big endian),比较好理解的,俗称大头 比如说char 'a',ascii为 0x61,那么它的utf-8,则为 [0x61],但utf-16是16位的,所以为[0x00,0x61] 再说UTF-16LE(little endian),俗称小头,这个是比较常用的 还是char 'a',它的代码却反过来: [0x61,0x00],据说是为了提高速度而迎合cpu的胃口,cpu就是这到倒着吃数据的,这里面有汇编的知识,不多说 然后说UTF-16,要从代码里自动判断一个文件到底是UTF-16LE还是BE,对于单纯的英文字符来说还比较好办,但要有特殊字符,图形符号,汉字,法文,俄语,火星语之类的话,相信各位都很头痛吧,所以,unicode组织引入了BOM的概念,即byte order mark,顾名思义,就是表名这个文件到底是LE还是BE的,其方法就是,在UTF-16文件的头2个字节里做个标记: LE [0xFF,0xFE],BE [0xFE,0xFF]
原文链接:https://www.f2er.com/sqlite/201736.html