Sqlite中文乱码问题

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

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

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

// 获取到的中文数据的转码 
void Change(string &str)  
{  
    int len  = MultiByteToWideChar(CP_UTF8,0,str.data(),-1,NULL,0);  
  
    WCHAR *strNew = new WCHAR[len+1];  
  
    MultiByteToWideChar(CP_UTF8,0,str.data(),-1,strNew,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, 0, CA2W((char*)str.data()), -1, NULL, 0, NULL, NULL);

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

	WideCharToMultiByte(CP_UTF8, 0, CA2W((char*)str.data()), -1, strNew, len, NULL, 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), 0, 0, &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, 0, 0, &errMsg);
			if (rc != SQLITE_OK)
			{
				printf("插入数据失败,错误码:%d,错误原因:%sn", rc, errMsg);
				MessageBox(NULL, _T("插入数据失败!"), _T("错误"), MB_ICONWARNING);
			}

		}

	}
	return 0;
}


                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值