最近一个项目使用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";
参考资料: