微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

SQLite读取中文的方案

由于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.jb51.cc/sqlite/201736.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐