Discuz! Board

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 3034|回复: 0
打印 上一主题 下一主题

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

[复制链接]

388

主题

602

帖子

2218

积分

金牌会员

Rank: 6Rank: 6

积分
2218
跳转到指定楼层
楼主
发表于 2016-11-17 11:26:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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也直接支持中文。



回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|firemail ( 粤ICP备15085507号-1 )

GMT+8, 2024-11-25 21:25 , Processed in 0.060345 second(s), 19 queries .

Powered by Discuz! X3

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表