>>>>>>>尊重版权,转载请注明文章出处。
在网上搜罗QSQLITE中文乱码问题的解决方法,都是说通过QTextCodec调用setCodecForCStrings显式设定编码来解决,不知道他们有没有亲自尝试,还是他们的使用环境与我不同,我都一一尝试无一成功。最后通过查看Qt关于QSQlite的源码终于让我解决自己遇到的问题。
首先说一下,我遇到QSQLITE中文乱码问题产生的原因。
我所访问的SQlite数据库是通过另一个程序生成,经过分析该程序在将中文插入到数据库时采用的GBK编码,并没有转换成UTF8格式就存储到SQlite中,由于SQlite存储文本使用的是UTF8格式,在使用QT提供的QSqlDatabase访问SQlite数据库时便会发生乱码。由于这个生成SQLite数据库的程序没有源代码,因而无法更改,只得从QSqlDatabase对SQlite访问的源代码下手。最后终于在src/sqldrivers/sqlite/qsql_sqlite.cpp中找到了解决办法。解决措施如下:
将该文件fetchNext函数中values[i+idx] = QString(reinterpret_cast<const QChar*>(
sqlite3_column_text16(stmt, i)),
sqlite3_column_bytes16(stmt, i) / sizeof(QChar));
更改为:
values[i+idx] = QString::fromAscii(reinterpret_cast<const char*>(
sqlite3_column_text(stmt, i)),
sqlite3_column_bytes(stmt, i));
重新编译QSqlite插件。
然后在使用QSqlQuery进行查询前,使用QTextCodec的setCodecForCStrings函数设置编码格式为GBK。
重新编译程序,中文乱码问题便解决了。