MFC下sqlite中文乱码问题

oO霹雳洋蛋Oo 2015-02-03 10:42:31
编程环境:MFC,C++语言,unicode字符集,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;
}



...全文
379 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2015-02-03
  • 打赏
  • 举报
回复
对电脑而言没有乱码,只有二进制字节;对人脑才有乱码。啊 GBK:0xB0 0xA1,Unicode-16 LE:0x4A 0x55,Unicode-16 BE:0x55 0x4A,UTF-8:0xE5 0x95 0x8A
FightForProgrammer 2015-02-03
  • 打赏
  • 举报
回复
前面我也遇到过。多调试几次貌似就可以找出问题了

64,639

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧