hechengjin 发表于 2016-11-17 11:26:19

QT中SQLite中文乱码的解决方案

http://www.icodelogic.com/?p=19
今天看需求时发现代码里SQLite数据库竟然忘了加入对中文字符的支持,以前c++和c#中这种问题的解决方法倒是很熟了,但是qt的很多接口还不太熟,于是请教google大神,网上用的最多的方案是使用QSqlQuery时将执行的字符串使用QObject::tr()转码。由于SQLite内部编码是用utf8,而windows是采用GBK,所以需要对QString进行转码,方法如下:QTextCodec::setCodecForTr(QTextCodec::codecForName(“UTF-8″));
QString querystr = QObject::tr(QString(“insert into Contact values(‘%1′)”).arg(entity->Name);
这样就将字符串转换为utf8格式,可以将中文字段正常插入到SQL中。ps:一般的linux系统默认的编码是unicode,因此不需要第一条语句,不过我还没有亲自 试验过。在使用过程中,我发现另一个问题,那就是采用上面的解决方案后,无论是在终端还是SQL管理器中查看执行结果,发现仍然出现乱码,经过debug发现问题出在QString 。虽然QString是不存在不支持中文的问题,但是在字符串中同时有中文字符和英文字符时,如:“QString a= “中文/English”;此时直接打印a,会显示乱码,需要指定QString的编码,虽然QString是采用unidoce保存字符的,但是不知道赋给的值是采用什么编码,于是默认是latin1编码,也就是将”中文/English”以latin的格式转换成unicode,于是打印中文时会乱码,我们需要告诉QString这是什么格式的编码以便正确的转换:QTextCodec::setCodecForCStrings(QTextCodec::codecForName(“GB2312″));
QTextCodec::setCodecForCStrings(QTextCodec::codecForName(“UTF-8″));
视系统的编码环境2选1即可,指定了编码格式后,QString中的中文字符就可以正常显示了。上面就是因为我的query语句使用QString.arg动态生成的,中文字符是在arg的参数中,因此需要指定编码让QString也直接支持中文。

页: [1]
查看完整版本: QT中SQLite中文乱码的解决方案