读书人

在Linux上用C++写的命令行程序使用了

发布时间: 2012-10-19 16:53:37 作者: rapoo

在Linux下用C++写的命令行程序,使用了sqlite3数据库,移植到Windows里中文出现乱码。
我之前在Linux里用C++写了个记账程序给自己用,是命令行程序,用了sqlite3数据库,用了近一年,没啥大问题。最近我开始用Windows7了(没办法,新买了笔记本电脑,驱动有问题,用Linux老是突然没反应,只能强行关机),我把程序移植到Windows下,用的编译器是mingw32,IDE是codeblocks。开始的时候程序的界面里的中文是乱码,后来发现源代码的编码是utf-8,我在codeblocks里用edit->file encoding里设置为system default选项,再编译,运行,界面的乱码就没啦。但是在运行程序的时候发现之前存到sqlite3数据库里的数据只要含中文的显示出来全是乱码,而如果全是数字则显示正常。请问是要改变数据库文件的编码还是要在C++程序里自己转换编码啊?搜了一下在C++里转换字符串编码的程序,感觉好麻烦啊。谢谢啦!
以下是我觉得可能相关的一些代码片段:
这是执行SQL查询的代码:

C/C++ code
bool DataBase::runSQL(const string & querySQL,        QueryResult & res){    //如果还没打开就查询,会报错。    if (!bOpen)    {        if (!openDataBase())        {            return false;        }    }    int rc = sqlite3_get_table(db, querySQL.c_str(), &res.result, &res.row,             &res.col, &errMsg);    if (rc != 0)    {        return false;    }    if (!closeDataBase())    {        return false;    }    return true;}

这是输出查询结果的函数
C/C++ code
//工具函数,输出记录的查询结果,which=1为收入支出记录,which=2为资产负债记录void outputResult(const string & sql, const int which){    DataBase incomeData;    QueryResult res;    if (!incomeData.runSQL(sql, res))    {        cout<<"查询失败!按任意键继续......";        cin.get();        cin.get();        return;    }    cout<<"查询结果为:"<<endl;    int t = 0;    int index = 0;    for (int i = res.col; i < (res.row+1)*res.col; i++)    {        t++;        if (t == 1)        {            index++;            cout<<"第"<<index<<"项:";            cout<<"项目ID=";        }        else if (t == 2)        {            cout<<"项目日期=";        }        else if (t == 3)        {            cout<<"项目名称=";        }        else if (t == 4)        {            cout<<"项目金额=";        }        else if (t == 5)        {            //根据类型ID查找类型名称            QueryResult TypeName;            string querysql;            if (which == 1)            {                querysql = "SELECT TypeName FROM IncomeType WHERE TypeID = ";            }            else if (which == 2)            {                querysql = "SELECT TypeName FROM InvestmentType WHERE TypeID = ";            }                        //以下的输出是乱码            querysql += res.result[i];            querysql += ";";            incomeData.runSQL(querysql, TypeName);                        //以下的输出是乱码            cout<<"项目类型="<<TypeName.result[1]<<";";        }        else if (t == 6)        {            cout<<"备注=";        }        if (t != 5)        {                        //以下输出是乱码            cout<<res.result[i]<<";";        }        if (t == 6)        {            t = 0;            cout<<endl;        }    }    cout<<"共有"<<index<<"项结果"<<endl;    cout<<"查询结束,按任意键继续......";    cin.get();    cin.get();}

另外完整的代码我早已经放到github上了,地址: https://github.com/zwdnet/Money
谢谢大家!

[解决办法]
可以肯定的是不需要改变sqlite3数据库里的数据的编码,乱码问题集中在C++这边进行。默认情况下sqlite3中用的是UTF-8编码,而Windows系统是本地编码,比如GBK等。
[解决办法]
可以肯定的是不需要改变sqlite3数据库里的数据的编码,乱码问题集中在C++这边进行。默认情况下sqlite3中用的是UTF-8编码,而Windows系统是本地编码,比如GBK等。

读书人网 >C++

热点推荐