在Linux上用C++写的命令行程序,使用了sqlite3数据库,移植到Windows里中文出现乱码
在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查询的代码:
这是输出查询结果的函数
另外完整的代码我早已经放到github上了,地址: https://github.com/zwdnet/Money
谢谢大家!
------解决方案--------------------
可以肯定的是不需要改变sqlite3数据库里的数据的编码,乱码问题集中在C++这边进行。默认情况下sqlite3中用的是UTF-8编码,而Windows系统是本地编码,比如GBK等。
------解决方案--------------------
可以肯定的是不需要改变sqlite3数据库里的数据的编码,乱码问题集中在C++这边进行。默认情况下sqlite3中用的是UTF-8编码,而Windows系统是本地编码,比如GBK等。
我之前在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等。