c++中关于SQLite中文乱码的解决方法

在使用SQLite的过程中(c++),如果创建一个表,如果SQL语句中包含中文字符,就会报错;如果是从数据库表中查询数据,如果数据库表中的某些字段为中文,查询结果也不能正常显示,出现这种情况的原因是因为SQLite的编码与工程的编码不一致造成的。

Sqlite的编码默认为UTF-8编码,而vc++工程中所编写的SQL语句,可能是Unciode或者ASCII码,特别是ASCII码,如果不进行转换,写入数据库以及从数据库中读出的数,都会是乱码(只针对中文字符),因此,本文主要写一下各种编码下的编码转换:

 

<pre class="cpp" name="code">//将ASCII码转换为UTF8编码
void ASCIIToUTF8(char cACSII[]  , char cUTF8[] ) 
{
	//先将ASCII码转换为Unicode编码
	int nlen= MultiByteToWideChar(CP_ACP,0,cACSII,-1,NULL,NULL);
	wchar_t *pUnicode = new wchar_t[SQL_MAX_LENTH];
	memset(pUnicode,0,nlen*sizeof(wchar_t));
	MultiByteToWideChar(CP_ACP,0,cACSII,-1,(LPWSTR)pUnicode,nlen);
	wstring wsUnicode = pUnicode ;
	//将Unicode编码转换为UTF-8编码
	nlen = WideCharToMultiByte(CP_UTF8,0,wsUnicode.c_str(),-1,NULL,0,NULL,NULL);
	WideCharToMultiByte(CP_UTF8,0,wsUnicode.c_str(),-1,cUTF8,nlen,NULL,NULL);
}
 

 

//将UTF-8编码转换为ASCII编码
void UTF8ToASCII(char *cUTF8 , char ASCII[])
{
	string str = cUTF8 ;
	//先将UTF8编码转换为Unicode编码
	int nLen = MultiByteToWideChar(CP_UTF8,0,str.c_str(),-1,NULL,0);
	wchar_t *pwcUnicode = new wchar_t[nLen] ;
	memset(pwcUnicode,0,nLen*sizeof(wchar_t));
	MultiByteToWideChar(CP_UTF8,0,str.c_str(),-1,(LPWSTR)pwcUnicode,nLen);
	//将Unicode编码转换为ASCII编码
	nLen = WideCharToMultiByte(CP_ACP,0,pwcUnicode,-1,NULL,0,NULL,NULL);
	WideCharToMultiByte(CP_ACP,0,pwcUnicode,-1,ASCII,nLen,NULL,NULL);
}


 

//将ASCII编码转换为Unicode编码
void ASCIIToUnicode(char cASCII[],wchar_t wcUnicode[])
{
	int nlen= MultiByteToWideChar(CP_ACP,0,cASCII,-1,NULL,NULL);
	MultiByteToWideChar(CP_ACP,0,cASCII,-1,(LPWSTR)wcUnicode,nlen);
}


 

//将Unicode编码转换为UTF-8编码
void UnicodeToUTF8(wchar_t wcUnicode[] , char cUTF8[] )
{
	wstring wsUnicode = wcUnicode ;
	int nLen =  WideCharToMultiByte(CP_UTF8,0,wsUnicode.c_str(),-1,NULL,0,NULL,NULL);
	WideCharToMultiByte(CP_UTF8,0,wsUnicode.c_str(),-1,cUTF8,nLen,NULL,NULL);
}


 

//将UTF-8编码转换为Unicode编码
void UTF8ToUnicode(char *cUTF8 , wchar_t wcUnicode[])
{
	string sUTF8 = cUTF8 ;
	int nLen = MultiByteToWideChar(CP_UTF8,0,sUTF8.c_str(),-1,NULL,0);
	MultiByteToWideChar(CP_UTF8,0,sUTF8.c_str(),-1,(LPWSTR)wcUnicode,nLen);
}


 

//将Unicode编码转换为ASCII编码
void UnicodeToUTF8(wchar_t wcUnicode[],char cASCII[])
{
	int nLen = WideCharToMultiByte(CP_ACP,0,wcUnicode,-1,NULL,0,NULL,NULL);
	WideCharToMultiByte(CP_ACP,0,wcUnicode,-1,cASCII,nLen,NULL,NULL);
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值