MFC下sqlite中文乱码问题
问题描述:在用sqlite3_open创建数据库test,以UTF-8编码保存含有中文的记录时,发现用
SQLite Expert Personal 3打开数据库时关于中文的记录全是乱码。同时,在程序中以unicode编码
读取数据库记录时发现中文也是乱码。以下我是程序中的主要代码,我查了很多,都说sqlite是
以utf-8编码,可是我以utf-8编码却是乱码,读取也是乱码,请问问题出在哪里?

CString Cini2View::FenGe(CString strLocalFileName1,CString NameBegin,CString NameEnd)
{ sqlite3_stmt *pstmt = 0;
const char *error = 0;
char *zErrMsg = 0;
int ret = sqlite3_open("fana.db", &m_pdb); //打开数据库,跟打开文本文件一样
if(ret!= SQLITE_OK)
{
AfxMessageBox(_T("打开数据库出错\n"));
sqlite3_close(m_pdb);
return 0;
}
//建立表
char *sql = " CREATE TABLE test(ge_id INT(4) PRIMARY KEY,name VARCHAR(30) ,valuess VARCHAR(100),formatss VARCHAR(50),description VARCHAR(200));" ;
sqlite3_exec( m_pdb , sql , 0 , 0 , &zErrMsg );
CStdioFile file;
file.Open(strLocalFileName1,CFile::modeRead);//打开文件,只读
CString str=_T(""),sum=_T("");
char* old_locale = _strdup( setlocale(LC_CTYPE,NULL));//解决汉字输入问题,对回调函数也是有效的。
setlocale( LC_CTYPE, "chs" );//设定
CString mingzi,zhi,geshi,zhushi,cons,zhuan,cha,ru,endcycle,pro,reg,res,car;
endcycle=_T("[sequences]");
cons=_T("const");
pro=_T("profile");
reg=_T("reagent");
res=_T("reservoir");
car=_T("card");
int jing=0,con=0,deng=0,fen=0,fenhao=0,youkuohao=0,prof=0,regf=0,resf=0,carf=0,zuokuohao=0,i=0;
CString substr=_T("");
while(file.ReadString(sum))
{
if(jing==sum.Find(endcycle))
{
break;
}
if(jing==sum.Find(_T('#')))
{
zhushi=sum.Right(sum.GetLength()-1);
}
else
{
if(con==sum.Find(cons))
{ //const之后,'='号之前赋值给mingzhi
zhuan=sum.Right(sum.GetLength()-con-cons.GetLength());
deng=zhuan.Find(_T('='));
mingzi=zhuan.Left(deng);
//‘=’号之后,';'之前赋值给zhi
zhuan=zhuan.Right(zhuan.GetLength()-deng-1);
fen=zhuan.Find(_T(';'));
zhi=zhuan.Left(fen);
geshi=_T("const name=n;");
//插入数据
i++;
cha=_T("INSERT INTO test (ge_id,name,valuess,formatss,description) VALUES (");
ru.Format(_T("%d,'%s','%s','%s','%s'"),i,mingzi,zhi,geshi,zhushi);
cha=cha+ru;
ru=_T(");");
cha=cha+ru;
sql = UnicodeToUtf8(cha) ;//unicode转换成utf-8编码
sqlite3_exec( m_pdb , sql, 0 , 0 , &zErrMsg );
mingzi=_T("");zhi=_T("");geshi=_T("");zhushi=_T("");ru=_T("");cha=_T("");deng=0;zhuan=_T("");
}
else
{
fenhao=sum.Find(_T(';'));
youkuohao=sum.Find(_T('}'));
if(fenhao!=-1&&youkuohao!=-1)//如果同时有;和}
{ deng=sum.Find(_T('='));
//"="号之前赋值给mingzi,之后给zhi
mingzi=sum.Left(deng);
zhi=sum.Right(sum.GetLength()-deng-1);
geshi=_T("name={n;}");
//插入数据
i++;
cha=_T("INSERT INTO test (ge_id,name,valuess,formatss,description) VALUES (");
ru.Format(_T("%d,'%s','%s','%s','%s'"),i,mingzi,zhi,geshi,zhushi);
cha=cha+ru;
ru=_T(");");
cha=cha+ru;
sql = UnicodeToUtf8(cha) ;//unicode转换成utf-8编码
sqlite3_exec( m_pdb ,sql , 0 , 0 , &zErrMsg );
mingzi=_T("");zhi=_T("");geshi=_T("");zhushi=_T("");ru=_T("");cha=_T("");deng=0;
}
else//不是同时有;和}
{ //如果有profile,reagent,reservoir,card。
if(prof==sum.Find(pro)||regf==sum.Find(reg)||resf==sum.Find(res)||carf==sum.Find(car))
{ zuokuohao=sum.Find(_T('{'));
//{之后,'='号之前赋值给mingzhi
zhuan=sum.Right(sum.GetLength()-zuokuohao-1);
deng=zhuan.Find(_T(','));
mingzi=zhuan.Left(deng);
//‘,’号之后,'}'之前赋值给zhi
zhuan=zhuan.Right(zhuan.GetLength()-deng-1);
fen=zhuan.Find(_T('}'));
zhi=zhuan.Left(fen);
geshi=_T("geshi={name,value}");
//插入数据
i++;
cha=_T("INSERT INTO test (ge_id,name,valuess,formatss,description) VALUES (");
ru.Format(_T("%d,'%s','%s','%s','%s'"),i,mingzi,zhi,geshi,zhushi);
cha=cha+ru;
ru=_T(");");
cha=cha+ru;
sql = UnicodeToUtf8(cha) ;//unicode转换成utf-8编码
sqlite3_exec( m_pdb , sql , 0 , 0 , &zErrMsg );
mingzi=_T("");zhi=_T("");geshi=_T("");zhushi=_T("");ru=_T("");cha=_T("");zhuan=_T("");
}
else
{ //如果没有profile,reagent,reservoir,card。
if(youkuohao!=-1)
{ //'='号之前给名字,之后给值。
deng=sum.Find(_T('='));
mingzi=sum.Left(deng);
deng=sum.Find(_T('{'));
zhuan=sum.Right(sum.GetLength()-deng-1);
fen=zhuan.Find(_T('}'));
zhi=zhuan.Left(fen);
geshi=_T("name={n;}");
//插入数据
i++;
cha=_T("INSERT INTO test (ge_id,name,valuess,formatss,description) VALUES (");
ru.Format(_T("%d,'%s','%s','%s','%s'"),i,mingzi,zhi,geshi,zhushi);
cha=cha+ru;
ru=_T(");");
cha=cha+ru;
sql = UnicodeToUtf8(cha) ;//unicode转换成utf-8编码
sqlite3_exec( m_pdb ,sql , 0 , 0 , &zErrMsg );
mingzi=_T("");zhi=_T("");geshi=_T("");zhushi=_T("");ru=_T("");cha=_T("");deng=0;zhuan=_T("");
}
}
}
}
}
}
file.Close();
//查询数据
sql =("SELECT * FROM test where formatss='const name=n;'");
int nrow = 0, ncolumn = 0; //查询结果集的行数、列数
char **azResult; //二维数组存放结果
sqlite3_get_table( m_pdb , sql , &azResult , &nrow , &ncolumn , &zErrMsg );
CString str1;
str= _T("");
int j=0;
for( j=0 ; j<( nrow + 1 ) * ncolumn ; j++ )
{
str1=Utf8ToUnicode(azResult[j]);//utf-8转换为unicode编码
str.Format(L"azResult[%d]:",j);
str=str+str1+L"\n";
//Utf8ToUnicode(Mu0ltzifu(str));
//AfxMessageBox((str));
}
sqlite3_close(m_pdb); //关闭数据库
m_pdb=NULL;
setlocale( LC_CTYPE, old_locale );
free( old_locale );//还原区域设定
}

/*功能:unicode转换为utf8编码
输入:unicode类型的字符串
输出:utf8类型的char*型数据
*/
char* Cini2View::UnicodeToUtf8(CString unicode)
{
int len = WideCharToMultiByte(CP_UTF8, 0, (LPCWSTR)unicode, -1, NULL, 0, NULL, NULL);
char *szUtf8=new char[len + 1];
memset(szUtf8, 0, len + 1);
WideCharToMultiByte (CP_UTF8, 0, (LPCWSTR)unicode, -1, szUtf8, len, NULL,NULL);
szUtf8[len]= '\0';
len=len-1;
return szUtf8;
}
/*功能:utf8转换为unicode编码
输入:utf8类型的字符串
输出:unicode类型的char*型数据
*/
WCHAR * Cini2View::Utf8ToUnicode(char* unicode)
{
int len = MultiByteToWideChar(CP_UTF8, 0, unicode, -1, NULL, 0);
WCHAR *szUtf8=new wchar_t[len + 1];
memset(szUtf8, 0, len + 1);
MultiByteToWideChar (CP_UTF8, 0, unicode, -1, szUtf8, len);
szUtf8[len]= '\0';
len=len-1;
return szUtf8;
}相关推荐
SQLite-with-MFC-in-Chinese:MFC SQLite 不会中文乱码
SQLite-with-MFC-in-Chinese MFC SQLite 不会中文乱码 SQLite3 是用C 语言编写的开源数据库,可移植性好,容易非常简单,而且及其轻便。 但是各种中文乱码 使用后 Build sqlite.lib 官网上只有源代码和dll文件下载,这里记录由源代码导出的lib库文件步骤。 从下载sqlite-amalgamation-xxxx.zip。解压缩后得到sqlite3.c 、sqlite3.h2个文件。 打开vs2010 ,档案-> 新增专案-> Visual C++ -> Win32 -> Win32 专案,项目名称输入sqlite,点击下一步, 应用程序类型选择"静态程式库", 取消“预编译头” 将sqlite3.c,sqlite3.h两个文件复制到这个专案目录下,在项目中将这两个文件加到对应的Header和Source里,直接build,然后
MFC实战:集成SQLite3实现本地数据存储完整指南
在Windows桌面应用开发中,嵌入式数据库是轻量级数据持久化的常见选择。它无需独立服务进程,数据以单文件形式存储,通过C语言API即可直接访问,具有部署简单、跨平台等优势。SQLite正是这类数据库的代表。理解其底层原理,如SQL预处理、参数绑定、事务提交机制,有助于开发者在C++工程中高效利用。对于基于MFC框架的传统界面程序,集成SQLite可显著降低数据存储成本,避免部署外部数据库客户端的繁琐。从配置SQLite环境、封装CString友好的数据访问层,到使用CListCtrl展示查询结果,这一套实
Sqlite数据库使用
Sqlite数据库使用,控制台程序,数据库的连接、插入、查询等操作。使用SQLiteSpy.exe查看数据库内容,可以到我的资源免费下载。注意:编码问题。
C++职工信息管理系统,基于MFC界面设计,系大一下学期课程设计.zip
C++职工信息管理系统,基于MFC界面设计,系大一下学期课程设计.zip
Vc下unicode和UTF8相互转换源代码
vc 6.0下,SQLite数据库使用过程中,SQL语句使用utf8编码,而CString 使用unicode编码


