微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

原文地址:https://www.jb51.cc/sqlite/202104.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐