Qt + SQLite3 + VS 开发时出现乱码的解决方法

最近一个项目使用Qt在VS2008中开发一个客户端,由于客户端数据量较小,所以数据库使用的是sqlite3,体积小,速度快,易维护,开箱即用,很好!

开发时,使用sqlite3.exe的客户端操作sqlite的数据库文件,insert和select都没问题,支持中文支持得很好,没有乱码;但


使用sqlite3的控制台insert进去的数据,再用Qt查询出来的时候,全是乱码


但是用Qt往sqlite的数据文件里insert进去的记录全部正常,没有乱码。


原因在于,sqlite3.exe的控制台的编码格式(在我的电脑上)是GBK,通过控制台insert到数据库中的内容是GBK格式的,但数据库认使用的是UTF-8格式存储的,所以,数据库中存储的实际上是乱码,而Qt中的字符串使用的是Unicode编码,所以用Qt查询出来的就是乱码了~

但为什么用控制台查询出来的是正常的呢?原因还是在控制台:控制台往数据库添加的是GBK格式的记录,这些记录被数据库保存存UTF-8;当通过控制台往外取数据的时候,取出来的还是GBK格式的数据,然后控制台使用GBK解码,所以一切正常,就像什么都没发生过一样~

同样的道理,在Qt中,使用的Unicode编码,所以,往数据库添加的记录都是Unicode格式的;再用Qt将数据取出来,当然也是正常的文本啦~

但是这些数据在控制台中看到的就是乱码!

怎么办?你如果像我一样舍不得控制台的话,就用一个SQLiteSpy的工具可以让你使用除sqlite3.exe之外工具来操作sqlite数据库文件包括内存数据库


正文完。

以下是一点心得,希望能对“Qt中出现乱码”问题的同学有所帮助:

1、关于QTextCodec

QTextCodec::setCodecForLocale(QTextCodec::codecForName("GB2312"));//设置Locale的编码格式,这个Locale编码主要是提供给后续代码使用QTextCodec::codecForLocale()
QTextCodec::setCodecForTr(QTextCodec::codecForLocale());//使用QObject::tr("...")转换字符串常量时,用于向Qt说明,待转换的字符串使用的是XXX编码格式
QTextCodec::setCodecForCStrings(QTextCodec::codecForLocale());//与上一句类似,表示用字符串常量构造QString时,向Qt说明,传入的字符串常量实参使用的是XXX编码格式

2、关于sqlite的编码格式(认使用的是UTF-8),以下命令都是在sqlite3.exe的控制台上执行的:

PRAGMA encoding; --显示sqlite当前的编码方案
PRAGMA encoding = "UTF-8";--设置sqlite的编码方案为UTF-8
PRAGMA encoding = "UTF-16";--设置sqlite的编码方案为UTF-16
PRAGMA encoding = "UTF-16le";
PRAGMA encoding = "UTF-16be";

参考资料:

1、QT文本编码转换方法

2、何将SQLite Encoding iso8859 改成 utf8

相关文章

SQLite架构简单,又有Json计算能力,有时会承担Json文件/RES...
使用Python操作内置数据库SQLite以及MySQL数据库。
破解微信数据库密码,用python导出微信聊天记录
(Unity)SQLite 是一个软件库,实现了自给自足的、无服务器...
安卓开发,利用SQLite实现登陆注册功能