• 14848阅读
  • 6回复

[提问]使用sqlite数据库显示乱码的问题 [复制链接]

上一主题 下一主题
离线tancu
 
只看楼主 倒序阅读 楼主  发表于: 2009-06-01
— 本帖被 XChinux 从 Qt基础编程 移动到本区(2013-04-01) —
本人近日在使用QT进行sqlite数据库编程时,出现中文数据显示乱码情况,附源码如下:
//main.cpp
#include <QtGui>
#include <QtCore/QTextCodec>
#include <QSqlTableModel>
#include <QTableView>
#include <QHeaderView>
#include <QSqlRecord>
#include <QtGui/QLabel>
#include <QString>
#include <QVariant>
#include "connection.h"
#include "sql.h"


int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QTextCodec::setCodecForTr(QTextCodec::codecForName("GBK"));

    //创建数据库连接
    if (!createConnection())
        return 1;
    //创建学生信息表
    createTables();
    //初始添加数据
   addData();




    enum{
        Student_Id = 0,
        Student_Schnum = 1,
        Student_Name = 2,
        Student_Sex = 3,
        Student_Nation = 4
    };

    QSqlTableModel *model = new QSqlTableModel();
    model->setTable("student");
    model->setSort(Student_Schnum, Qt::AscendingOrder);
    model->setHeaderData(Student_Schnum, Qt::Horizontal, QObject::tr("学号"));
    model->setHeaderData(Student_Name, Qt::Horizontal, QObject::tr("姓名"));
    model->setHeaderData(Student_Sex, Qt::Horizontal, QObject::tr("性别"));
    model->setHeaderData(Student_Nation, Qt::Horizontal, QObject::tr("民族"));
    model->select();

    QTableView *view = new QTableView;
    view->setModel(model);
    view->setSelectionMode(QAbstractItemView::SingleSelection);
    view->setSelectionBehavior(QAbstractItemView::SelectRows);
    view->setColumnHidden(Student_Id, true);
    view->resizeColumnsToContents();
    view->setEditTriggers(QAbstractItemView::NoEditTriggers);

    QHeaderView *header = view->horizontalHeader();
    header->setStretchLastSection(true);



    view->show();
    return a.exec();
}

//connection.h
#ifndef CONNECTION_H
#define CONNECTION_H

#include <QMessageBox>
#include <QSqlDatabase>
#include <QSqlError>
#include <QSqlDriver>


inline bool createConnection()
{
    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
    db.setDatabaseName("sim.dat");
    if (!db.open()) {
        QMessageBox::warning(0, QObject::tr("Database Error"),
                             db.lastError().text());
        return false;
    }
    return true;
}



#endif // CONNECTION_H

//sql.h
#include <QSqlQuery>


#ifndef SQL_H
#define SQL_H
inline void createTables()
{
    QSqlQuery query;
    query.exec("CREATE TABLE student ("
               "id INTEGER PRIMARY KEY, "
               "schnum INTEGER NOT NULL, "
               "name VARCHAR(40) NOT NULL, "
               "sex VARCHAR(4) NOT NULL, "
               "nation VARCHAR(10) NOT NULL)");
}

inline void addData(){
    QSqlQuery query;
    for(int i =0;i<100;i++){
    query.exec("INSERT INTO student (schnum, name, sex, nation) VALUES (2614103, '天残脚,'男', '汉族')");
}

}
#endif // SQL_H

上网查了许多无果,后来在阅读一篇技术文章中无意发现,原来在插入数据语句若有中文必须先QObject::tr()一番,即进行编码,
将Sql.h中query.exec("INSERT INTO student (schnum, name, sex, nation) VALUES (2614103, '天残脚,'男', '汉族')");改为如下query.exec(QObject::tr("INSERT INTO student (schnum, name, sex, nation) VALUES (2614103, '天残脚,'男', '汉族')"));
结果在显示中都能得正确显示。
注意,如果语句 QTextCodec::setCodecForTr(QTextCodec::codecForName("GBK"));中的编码改为utf-8则会显示乱码。
一人业余菜鸟对编程坚持了十几年...
离线jorneyr

只看该作者 1楼 发表于: 2009-06-01
那是因为你的系统问题, 在我这, 用的就是utf8, 在界面, sqlite中都不会乱码, 因为我的系统是用unicode编码. 同样的数据库, 复制到windows, sqlite中是乱码, 但界面不会, 因为windows使用的是gbk等编码, 而sqlite使用的却是unicode编码.
离线channon
只看该作者 2楼 发表于: 2009-06-01
sqlite是用utf8存数据的,所以字符串要用utf8编码
操作系统: Archlinux
Qt SDK: Qt 4.7.1 for Linux
开发方向: Qt,Java
常用数据库:Firebird、SQLite
离线tancu
只看该作者 3楼 发表于: 2009-06-01
非常感谢楼上的解答。我想问一下,如果系统的编码不一样,那以后程序做好后在不同的系统还是有可能出现乱码,这该怎么办?
一人业余菜鸟对编程坚持了十几年...
离线tancu
只看该作者 4楼 发表于: 2009-06-02
今天思考了一番,对代码作出一些改进,将上面设置编码的地方改为:QTextCodec::setCodecForTr(QTextCodec::codecForLocale()));设置为本地编码,插入数据时对查询语句进行QObject::tr(),结果数据库和显示都为中文,能正常显示了。
一人业余菜鸟对编程坚持了十几年...
离线hehui

只看该作者 5楼 发表于: 2009-09-17
使用QTextCodec是自找麻烦的做法!
离线dragonfever
只看该作者 6楼 发表于: 2011-04-18
初学时,qt的中文显示部分很麻烦啊,多谢楼主分享,学习了
快速回复
限100 字节
 
上一个 下一个