文章标题

1 篇文章 0 订阅

sqlite3 回调使用 unicode

static int callback(void *data, int argc, char **argv, char **azColName){
    int i;
    wchar_t ASCII[64]={0};
    for(i=0; i<argc; i++){
        CCharEncodeUtility::UTF8ToUnicode(argv[i] ? argv[i] : "NULL",ASCII);
        CString str;
        //str.Format((char*)("%s = %s\n"), azColName[i],ASCII );
        TRACE(L"%s\t",ASCII);
    }
    TRACE(L"\n");
    return 0;
}

int CFCIAnalysisView::QueryDB(CRecordListMap& map)
{
    int result = 0;
    COleDateTime dtEndTime(m_ctrlEndTime.GetDate());
    COleDateTime dtBeginTime( m_ctrlBeginTime.GetDate() );

    int testType = m_testType;
    int unit = m_ctrlUnit.GetCurSel()+1;

    sqlite3 *db;
    char *zErrMsg = 0;
    int rc;
    rc = sqlite3_open("C:\\sqlite\\FCI.db", &db);

    if( rc ){
        TRACE(_T("Can't open database: %s\n"), sqlite3_errmsg(db));
        exit(0);
    }else{
        TRACE(_T("Opened database successfully\n"));
    }

    dtBeginTime.Format(L"%Y-%m-%d %H:%M:%S");

    CString str;
    str  = L"SELECT * from RecordsMap where ( TestTime >= ";
    str = str+ "'"+dtBeginTime.Format(L"%Y-%m-%d %H:%M:%S")+"'"
            + " and TestTime <= " + "'" + dtEndTime.Format(L"%Y-%m-%d %H:%M:%S") + "'" + ")" ;
    TRACE(L"%s\n",str);

    char sql[512];
    CCharEncodeUtility::UnicodeToUTF8(str.GetBuffer(str.GetLength()),sql);
    TRACE(L"%s\n",str);

    const char* data = "Callback function called";
    rc = sqlite3_exec(db, sql, callback, (void*)data, &zErrMsg);

    str.ReleaseBuffer();    

    if( rc != SQLITE_OK ){
        TRACE( _T("SQL error: %s\n"), zErrMsg);
        sqlite3_free(zErrMsg);
    }else{
        TRACE(_T("Operation done successfully\n"));
    }

    sqlite3_close(db);

    return result;
}

字符转换工具

#include <string>
using namespace std;

#if !defined(AFX_CHARENCODEUTILITY_H__A2A043C3_E51E_4219_BA24_C086630D3D92__INCLUDED_)
#define AFX_CHARENCODEUTILITY_H__A2A043C3_E51E_4219_BA24_C086630D3D92__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

class CCharEncodeUtility  
{
public:
    CCharEncodeUtility(){};
    virtual ~CCharEncodeUtility(){};
public:
    //在使用SQLite的过程中(c++),如果创建一个表,
    //如果SQL语句中包含中文字符,就会报错;如果是从数据库表中查询数据,
    //如果数据库表中的某些字段为中文,查询结果也不能正常显示,出现这种
    //情况的原因是因为SQLite的编码与工程的编码不一致造成的。
    //Sqlite的编码默认为UTF-8编码,而vc++工程中所编写的SQL语句,
    //可能是Unciode或者ASCII码,特别是ASCII码,如果不进行转换,
    //写入数据库以及从数据库中读出的数,都会是乱码(只针对中文字符),
    //因此,本文主要写一下各种编码下的编码转换:

    static 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];  
        wchar_t *pUnicode = new wchar_t[512];  
        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编码  
    static 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编码  
    static 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编码  
    static 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编码  
    static 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);  
    } 
};

#endif // !defined(AFX_CHARENCODEUTILITY_H__A2A043C3_E51E_4219_BA24_C086630D3D92__INCLUDED_)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值