加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

SQLite读取中文的方案

发布时间:2020-12-12 20:25:47 所属栏目:百科 来源:网络整理
导读:由于SQLite3支持UTF-16,所以创建数据的时候编码方案选择UTF16而不是UTF8。 创建表然后添加数据使用下面的代码即可读出中文。他是visual studio 2008创建智能设备程序在windows ce 5.0下测试ok! sqlite3* db; sqlite3_stmt *stat; const unsigned char* ctem

由于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("WindowsWB98F.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("%dn",dwend-dwtimer);
printf("%sn",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]

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读