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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |