firemail

标题: QT中SQLite中文乱码的解决方案 [打印本页]

作者: hechengjin    时间: 2016-11-17 11:26
标题: 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也直接支持中文。








欢迎光临 firemail (http://firemail.wang:8088/) Powered by Discuz! X3