• 10029阅读
  • 6回复

[提问]如何让sqlite数据库可以保存汉字? [复制链接]

上一主题 下一主题
离线hanxiao6904
 

只看楼主 倒序阅读 楼主  发表于: 2008-07-09
— 本帖被 XChinux 从 Qt基础编程 移动到本区(2013-04-01) —
如何让sqlite数据库可以保存汉字?
离线XChinux

只看该作者 1楼 发表于: 2004-01-01
是unicode的,能直接保存的吧?
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线sy1413

只看该作者 2楼 发表于: 2011-03-07
可以保存汉字 只是乱码
hello world!
离线hehui

只看该作者 3楼 发表于: 2011-04-09
正常连接保存汉字是没有任何问题的
离线realfan

只看该作者 4楼 发表于: 2012-04-22
参考一下这里
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也直接支持中文。



原创文章,转载请注明:转载自CodeLogic[http://www.icodelogic.com]
本文链接地址: http://www.icodelogic.com/?p=19

tags: QT、SQLite、乱码
« 博客终于正式开通啦!Emacs在windows下编辑linux文档出现中文乱码的解决方法 »
没有评论▼
离线terry_zhouji
只看该作者 5楼 发表于: 2012-04-24
好像Qt直接插入的中文字段值都是当前设置的编码类型,在sqlite中读出来都是乱码,但是在Qt显示却是正确的。应该是转码的问题,这个我觉得只要能显示就行,呵呵!
离线雪碧击水

只看该作者 6楼 发表于: 2012-05-15
设置格式为UTF-8
快速回复
限100 字节
 
上一个 下一个