Sqlite中文乱码问题

前端之家收集整理的这篇文章主要介绍了Sqlite中文乱码问题前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

sqlite中写中文时候,sqlite是用的UTF-8编码的,所以要转码

// 获取到的中文数据的转码 <pre name="code" class="cpp">void UTF8Transcoding(string &str)  
{  
    int len  = WideCharToMultiByte(CP_UTF8,CA2W((char*)str.data()),-1,NULL,NULL);  
  
    char *strNew = new char[len+1];  
  
    WideCharToMultiByte(CP_UTF8,strNew,len,NULL);  
  
    strNew[len] = '\0';  
    str.clear();  
  
    str = strNew;  
    delete[] strNew;  
  
    return ;  
}  

 但是你从数据库中读数据又要转回来: 
 

// 获取到的中文数据的转码
void Change(string &str)  
{  
    int len  = MultiByteToWideChar(CP_UTF8,str.data(),0);  
  
    WCHAR *strNew = new WCHAR[len+1];  
  
    MultiByteToWideChar(CP_UTF8,len);  
  
    str.clear();  
  
    str = CW2A(strNew);  
    delete[] strNew;  
  
    return ;  
}  

 
 

一段例子

#include "stdafx.h"
#include <windows.h>  
#include "atlbase.h"
#include<string>
#include "sqlite3.h"  


using namespace std;
void UTF8Transcoding(string &str)
{
	int len = WideCharToMultiByte(CP_UTF8,NULL);

	char *strNew = new char[len + 1];

	WideCharToMultiByte(CP_UTF8,NULL);

	strNew[len] = '\0';
	str.clear();

	str = strNew;
	delete[] strNew;

	return;
}


int _tmain(int argc,_TCHAR* argv[])
{
	char *errMsg;
	int rc;
	sqlite3 *db;
	rc = sqlite3_open("033001.db",&db);
	auto sql = _T("create table if not exists user(ID varchar(20),Name varchar(20),Age int,Nation varchar(20),Major varchar(20));");
	if (rc == sqlITE_OK)
	{
		//MessageBox(NULL,_T("打开数据库成功!"),_T("消息"),MB_OK | MB_ICONWARNING);
		rc = sqlite3_exec(db,CW2A(sql,CP_UTF8),&errMsg);
		if (rc != sqlITE_OK)
		{
			printf("创建表失败,错误码:%d,错误原因:%sn",rc,errMsg);
			MessageBox(NULL,_T("创建表user失败!"),_T("错误"),MB_ICONWARNING);
		}


		for (int i = 1; i < 6; i++)
		{
			char c2[20] = "";
			c2[0] = i + '0';

			char c1[128] = "insert into user values('01','张三',";
			char c3[128] = ",'汉','软件');";
			strcat(c1,c2);
			strcat(c1,c3);


			string temp = c1;
			UTF8Transcoding(temp);
			const char* temp_c = temp.data();;
			rc = sqlite3_exec(db,temp_c,&errMsg);
			if (rc != sqlITE_OK)
			{
				printf("插入数据失败,错误码:%d,errMsg);
				MessageBox(NULL,_T("插入数据失败!"),MB_ICONWARNING);
			}

		}

	}
	return 0;
}

猜你在找的Sqlite相关文章